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

随机“排序”的最有效方法(混乱)-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;
    }}


凤凰求蛊
浏览 639回答 3
3回答

慕标5832272

一个很好的线性时间改组算法是费舍-耶茨洗牌.你会发现你提出的算法的一个问题是,当你接近洗牌结束的时候,你的循环将花费大量的时间去寻找那些尚未被交换的随机选择的元素。一旦切换到最后一个元素,这可能需要不确定的时间。而且,如果要排序的元素数为奇数,则算法似乎永远不会终止。

慕码人8056858

static&nbsp;Random&nbsp;random&nbsp;=&nbsp;new&nbsp;Random();public&nbsp;static&nbsp;IEnumerable<T>&nbsp;RandomPermutation<T>(IEnumerable<T>&nbsp;sequence){ &nbsp;&nbsp;&nbsp;&nbsp;T[]&nbsp;retArray&nbsp;=&nbsp;sequence.ToArray(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;retArray.Length&nbsp;-&nbsp;1;&nbsp;i&nbsp;+=&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;swapIndex&nbsp;=&nbsp;random.Next(i,&nbsp;retArray.Length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(swapIndex&nbsp;!=&nbsp;i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;temp&nbsp;=&nbsp;retArray[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retArray[i]&nbsp;=&nbsp;retArray[swapIndex]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retArray[swapIndex]&nbsp;=&nbsp;temp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;retArray;}修改以处理实现IEnDigable的列表或其他对象
打开App,查看更多内容
随时随地看视频慕课网APP