为了账号安全,请及时绑定邮箱和手机立即绑定

随机“排序”的最有效方法(混乱)-C#中的整数列表

随机“排序”的最有效方法(混乱)-C#中的整数列表

C#
凤凰求蛊 2019-07-09 14:49:45
随机“排序”的最有效方法(混乱)-C#中的整数列表我需要以最有效的方式对整数列表(0-1999)进行随机排序。有什么想法吗?目前,我正在做这样的事情:bool[] bIndexSet = new bool[iItemCount];for (int iCurIndex = 0; iCurIndex < iItemCount; iCurIndex++){     int iSwapIndex = random.Next(iItemCount);     if (!bIndexSet[iSwapIndex] && iSwapIndex != iCurIndex)     {         int iTemp = values[iSwapIndex];         values[iSwapIndex] = values[iCurIndex];         values[iCurIndex] = values[iSwapIndex];         bIndexSet[iCurIndex] = true;         bIndexSet[iSwapIndex] = true;     }}
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

一个很好的线性时间改组算法是费舍-耶茨洗牌.

你会发现你提出的算法的一个问题是,当你接近洗牌结束的时候,你的循环将花费大量的时间去寻找那些尚未被交换的随机选择的元素。一旦切换到最后一个元素,这可能需要不确定的时间。

而且,如果要排序的元素数为奇数,则算法似乎永远不会终止。


查看完整回答
反对 回复 2019-07-09
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

static Random random = new Random();public static IEnumerable<T> RandomPermutation<T>(IEnumerable<T> sequence){
    T[] retArray = sequence.ToArray();


    for (int i = 0; i < retArray.Length - 1; i += 1)
    {
        int swapIndex = random.Next(i, retArray.Length);
        if (swapIndex != i) {
            T temp = retArray[i];
            retArray[i] = retArray[swapIndex];
            retArray[swapIndex] = temp;
        }
    }

    return retArray;}

修改以处理实现IEnDigable的列表或其他对象


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 638 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信