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;
        }

如有理解错误,欢迎指正,谢谢!

posted @ 2010-12-15 12:51  Chris Cheung  阅读(790)  评论(0编辑  收藏  举报