zoukankan      html  css  js  c++  java
  • Cycle Sort

    Cycle sort的思想与计数排序太像了,理解了基数排序再看这个会有很大的帮助,

    圈排序与计数排序的区别在于圈排序只给那些需要计数的数字计数,先看完文章吧,看完再回来理解这一句话

    所谓的圈的定义,我只能想到用例子来说明,实在不好描述

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

    第一部分

         第一步,我们现在来观察待排数组和排完后的结果,以及待排数组的索引,可以发现

    排完序后的6应该出现在索引4的位置上,而它现在却在位置0上,

    记住这个位置啊,一直找到某个数应该待在位置0上我们的任务就完成了

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

         第二步,而待排数组索引4位置上的5应该出现在索引3的位置上

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

         第三步,同样的,待排数组索引3的位置是1,1应该出现在位置0上,注意注意,找到这么一个数了:1,它应该待在位置0上

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

         第四步,而索引0处却放着6,而6应该出现在索引4的位置,至此可以发现,回到原点了,问题回到第一步了,

    所以这里并不存在所谓的第四步,前三步就已经转完一圈了

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

    这就是所谓的一圈!真不好描述,不知道您看明白没...汗.

    前三步转完一圈,得到的数据分别是[ 6 5 1 ]

    第二部分

         第一步,圈排序并不是一圈排序,而一圈或多圈排序,所以,还得继续找,这一步从第二个数字2处开始转圈

    待排中的2位于索引1处,排序完毕仍然处于位置1位置,所以这一圈完毕,得到圈数据[ 2 ]

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

    第三部分

         第一步,同上,4也出现了它应该待的位置,结束这一圈,得到第三个圈:[ 4 ]

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

    第四部分

         第一步,由于1和5出现在第一圈里,这是什么意思呢,说明这两个数已经有自己的圈子了,不用再找了,

    即是找,最后还是得到第一圈的数据[ 6 5 1 ],所以,1和5跳过,这一部分实际应该找的是9,来看看9的圈子

    9应该出现在索引5的位置,实际上它就在索引5的位置,与第二部分的第一步的情况一样,所以这一圈的数据也出来了:[ 9 ]

    待排数组[ 6 2 4 1 5 9 ]

    排完序后[ 1 2 4 5 6 9 ]

    数组索引[ 0 1 2 3 4 5 ]

    一共找到四个圈子,分别是

    [ 6 5 1 ] , [ 2 ] ,[ 4 ] , [ 9 ]

    如果一个圈只有一个数字,那么它是不需要转圈的,即不需要排序,那么只有第一个圈排序即可

    你可能要问了,前边的那些圈子都是基于已知排序结果才能得到,我都已知结果还排个毛啊

    以上内容都是为了说明什么是圈,知道什么是圈后才能很好的理解圈排序

    现在来分解排序的细节

    第一步,将6取出来,计算出有4个数字比6小,将6放入索引4,同时原索引4位置的数字5出列

    排序之前[ 0 2 4 1 5 9 ] 6

    排序之后[ 0 2 4 1 6 9 ] 5

    索引位置[ 0 1 2 3 4 5 ]

    第二步,当前数字5,计算出有3个数字比5小,将5放入索引3,同时原索引3位置的数字

    排序之前[ 0 2 4 1 6 9 ] 5

    排序之后[ 0 2 4 5 6 9 ] 1

    索引位置[ 0 1 2 3 4 5 ]

    第三步,当前数字1,计算出有0个数字比1小,将1放入索引0,索引0处为空,这圈完毕

    排序之前[ 0 2 4 5 6 9 ] 1

    排序之后[ 1 2 4 5 6 9 ]

    索引位置[ 0 1 2 3 4 5 ]

    第一个圈[ 6 5 1 ]完毕

    第四步,取出下一个数字2,计算出有1个数字比2小,将2放入索引1处,发现它本来就在索引1处

    第五步,取出下一个数字4,计算出有2个数字比4小,将4放入索引2处,发现它本来就在索引2处

    第六步,取出下一个数字5,5在第一个圈内,不必排序

    第七步,取出下一个数字6,6在第一个圈内,不必排序

    第八步,取出下一个数字9,计算出有5个数字比9小,将9放入索引5处,发现它本来就在索引5处

    全部排序完毕

  • 相关阅读:
    041.PGSQL-pgsql常用命令-查看日志文件大小、数据目录、运行日志相关配置、当前lsn
    041.PGSQL-pgsql时间日期错误问题,原来是系统时间问题,使用远程的NTP时间服务器来提供时间的话,需要使用timedatectl设置将NTP时间同步开启。
    040.PGSQL-备份和恢复-增量备份-创建基础备份
    039.PGSQL-备份和恢复-增量备份-开启wal归档、并设置定时清理备份之后的wal文件
    037.PGSQL-事务 savepoint 保存点、rollback to 回滚
    硬件黑客之无线电安全 --- Proxmark3 RDV4 套件
    我有一个想法。。。
    硬件嘿客之嘿客仓库
    WPA GPU基准测试
    什么是家用路由器,带你重新认识一下
  • 原文地址:https://www.cnblogs.com/jxhd1/p/6528123.html
Copyright © 2011-2022 走看看