Cycle Sort
前两天在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; }
如有理解错误,欢迎指正,谢谢!