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

待排数组[ 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处

全部排序完毕
以上算法讲解来自kkun


from __future__ import print_functiondef cycle_sort(array):"""圈排序(不稳定排序)默认升序计数排序是另开辟空间存放排序结果,圈排序是不开辟空间,直接进行组内交换"""ans = 0   #记录发生交换的次数,不用在意,无关紧要,可删#外层循环处理列表中的每一个圈,一次遍历出现一个圈for cycleStart in range(0, len(array) - 1):item = array[cycleStart]   #取出待排序的元素,item一直记录一圈的元素# 找到item应该放的位置,跟计数排序相似,统计列表中有多少个元素比item小pos = cycleStart #记录位置for i in range(cycleStart + 1, len(array)):if array[i] < item:pos += 1# item也存在圈但这个圈只有它自己,表示item已经归位,不用改变if pos == cycleStart:continue  #跳过本次循环继续下次循环# 这四行代码是处理列表中相同的元素while item == array[pos]:#如果相同,就直接放在pos的后一个位置pos += 1array[pos], item = item, array[pos]#item最终归位,并把item赋新值ans += 1#处理新的itemwhile pos != cycleStart:#pos=cycleStart就代表又回到了起点,表示已有元素归到#cycleStart位置上,一圈处理完毕# 以下代码跟上面思路一样pos = cycleStartfor i in range(cycleStart + 1, len(array)):if array[i] < item:pos += 1while item == array[pos]:pos += 1array[pos], item = item, array[pos]ans += 1return ansif __name__ == '__main__':try:raw_input          # Python 2except NameError:raw_input = input  # Python 3user_input = raw_input('输入待排序的数,用\",\"分隔:\n').strip()#strip() 方法用于移除字符串头尾指定的字符(默认为空格)unsorted = [int(item) for item in user_input.split(',')]n = len(unsorted)cycle_sort(unsorted)print("排序后 : ")for i in range(0, n):print(unsorted[i], end=' ')

一些说明:

  • 我的github项目上有完整的算法代码,欢迎star,fork.
  • 这里的所有算法均用python实现,“翻译”自国外某程序员的项目。

圈排序——python相关推荐

  1. python基础教程书籍推荐-小猿圈推荐Python入门书籍,不知道这些你就太low了。

    原标题:小猿圈推荐Python入门书籍,不知道这些你就太low了. PYPL发布6月编程语言排行榜,盘踞前五名的分别是Python.Java.Java.C# 和 PHP.近五年,Python采用率高居 ...

  2. 希尔排序python实现

    希尔排序python实现 希尔排序是直接插入排序的加强版,也称为减小增量排序.以从小到大排序为例进行简要分析. 算法思想 希尔排序的排序思想在先将原序列划分成若干个子序列,其中划分的依据为按照间隔ga ...

  3. 直接排序python实现

    直接排序python实现 排序问题是算法领域非常经典的案例,其中的一些排序算法(例如堆排序)还用到了数据结构的知识.在最近一段时间,我打算将常见的排序算法都用python实现一遍,做一个排序算法总结, ...

  4. C语言圈排序Cycle Sort算法(附完整源码)

    圈排序Cycle Sort 算法 圈排序Cycle Sort 算法的完整源码(定义,实现,main函数测试) 圈排序Cycle Sort 算法的完整源码(定义,实现,main函数测试) #includ ...

  5. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  6. Hark的数据结构与算法练习之圈排序

    算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...

  7. 计数排序和桶排序——python和javascript实现

    计数排序 python版 不稳定计数排序 # 不稳定计数排序 def count_sort(arr):max,min = findMaxAndMin(arr)space = max - mincoun ...

  8. 空字符串计数、让字典可排序...Python冷知识(五)

    本文转载自Python编程时光(ID: Python-Time) 冷知识系列,直至今日,已经更新至第五篇.前四篇给你准备好了,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) ...

  9. python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...

    本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...

最新文章

  1. 一种注册表沙箱的思路、实现——注册表的一些基础知识
  2. linux中编译C语言程序
  3. 视频目标检测跟踪--Detect to Track and Track to Detect
  4. 车联网 python_利用百度车联网提供的天气查询接口用python查询天气信息
  5. 常用汇编浮点操作指令
  6. leetcode1028. 从先序遍历还原二叉树(dfs/栈)
  7. 诺基亚AirScale支持低频段和高频段5G服务 确保运营商投资收入
  8. 数据又多又散,“孤岛困境”怎样破局?
  9. C++11中新特性之:lambda 表达式
  10. 亚马逊创始人贝佐斯离婚协议本周生效 前妻分得380亿美金
  11. checkbox取反
  12. Weak Supervision: A New Programming Paradigm for Machine Learning
  13. JDBC09 CLOB文本大对象
  14. S7-200 CPU224XP 通讯连接不上
  15. 各种神经网络的应用领域,神经网络还有哪些应用
  16. Python —— 第一部分 序列
  17. 耿建超英语语法---陈述句(2)
  18. java标签用setbounds,java-摆动setResizable和setBounds
  19. 按要求写mysql语句_根据要求写SQL 语句
  20. 毕业实习大作业(Android-Spring Boot-MySQL 前后端分离项目 快速上手实例)

热门文章

  1. 记录开始学习AS400(01)
  2. 关于嵌入式的技术竞争力
  3. 倒计时1天!亮点抢先看,2022京东云产业融合新品发布会
  4. 【电影评价】——可爱的电影适合可爱的你!!!一直更新中
  5. 多项式乘积求极值点与拐点“比较快速”的方法:沉鱼落雁闭月羞花
  6. 互联网的那点事:商业模式、开放平台、开放开源标准
  7. JavaScript中方法或者变量名称前加下划线的是什么意思?
  8. 计算机链接投影蓝屏,日立投影仪蓝屏原因及解决方法
  9. 华为电子邮件显示未读邮件1_您所说的话:如何使电子邮件垃圾邮件保持整洁...
  10. PHP学习笔记-Session