前两天在codeproject看到一篇排序算法的文章sorting algorithms in C# ,看了今晚对仔细看了一下Cycle Sort,终于明白其中的原理:
Cycle Sort(其实中文叫什么?)其实就是循环数组Arr每个元素,将当前元素Item放到最合适的位置,按升序的话,则计算小于Item的数据个数比如n,
将item赋值给Arr[n]元素,同时,item被赋值为原有n位置上的值,继续循环,为item寻找合适位置,直到所有小于Item的个数都在合适的位置。
然后取出所有Arr下一元素,继续上述的循环。下面是注释过的代码,看了好久才弄懂,自己mark一下,呵呵。调试中还发现,该算法对于数据重复性率不高的数组
效率可能会快些,因为可以少了不少循环。
/// <summary>
/// cycle sort,每次循环都将各个元素放在最合适的位置
/// </summary>
/// <param name="arrayToSort"></param>
/// <returns></returns>
public static IList CycleSort(IList arrayToSort)
{
int writes = 0;
for (int cycleStart = 0; cycleStart < arrayToSort.Count; cycleStart++)
{
//讲第cycleStart个元素赋值给item
object item = arrayToSort[cycleStart];
//pos为item的位置
int pos = cycleStart;
do
{
int to = 0;
//获取item的最合适位置,也就是查询除item本身所有小于item的个数
for (int i = 0; i < arrayToSort.Count; i++)
{
if (i != cycleStart && ((IComparable)arrayToSort[i]).CompareTo(item) < 0)
{
to++;
}
}
//如果to的位置不是当前位置,则将item放到to位置
if (pos != to)
{
while (pos != to && ((IComparable)item).CompareTo(arrayToSort[to]) == 0)
{
to++;
}
object temp = arrayToSort[to];
arrayToSort[to] = item;
//同时将to位置值赋值给item,下次循环为to位置的值寻找最合适位置
item = temp;
writes++;
//将pos赋值为to位置
pos = to;
}
} while (cycleStart != pos);//循环直至所有小于item的元素都在合适的位置
}
return arrayToSort;
}
如有理解错误,欢迎指正,谢谢!