zoukankan      html  css  js  c++  java
  • 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;
            }
    

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

  • 相关阅读:
    make编译四
    【原创】大叔经验分享(73)scala akka actor
    【原创】大数据基础之Logstash(6)mongo input
    【原创】数据库基础之Sqlite
    【原创】大叔经验分享(72)mysql时区
    【原创】大数据基础之Chronos
    【原创】Linux基础之logrotate
    【原创】大数据基础之Drill(1)简介、安装及使用
    【原创】Java基础之Nginx缓存
    【原创】运维基础之Amplify
  • 原文地址:https://www.cnblogs.com/coolkiss/p/1906562.html
Copyright © 2011-2022 走看看