算法说明

圈排序是选择排序的一种。其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字。根据比较移动到不需要移动时,就代表一圈结束。最终要进行n-1圈的比较。   这个比较说起来比较抽象,所以举例子是最好的方法,这里例子使用的是这里的,望见谅:

待排数组[ 6 2 4 1 5 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处

全部排序完毕

代码

使用是java

package hark.sort.selectionsort;import java.util.Arrays;/** 圈排序*/
public class CycleSort {public static void main(String[] args) {int[] arrayData = { 5, 5, 9, 6, 6, 7, 4, 1, 1, 2, 3, 3, 8 };CycleSortMethod(arrayData);System.out.println(Arrays.toString(arrayData));}public static void CycleSortMethod(int[] arrayData) {int value, position, temp;for (int i = 0; i < arrayData.length; i++) {value = arrayData[i]; // 当前位置的值position = i; // 位置起始索引for (int j = i + 1; j < arrayData.length; j++) { // 找出更小的数字,并且position++if (arrayData[j] < value) {position++;}}if (position == i) // 如果没有发现比第i索引下数字小的,则i索引的数字不需要转圈圈(挪地方){continue;}// 去除重复while (value == arrayData[position]) {position++;}temp = arrayData[position];arrayData[position] = value;value = temp;// 重复上边的交换// 最终找到圈的结尾,也就是position==i(和代码第27行的一样啦)while (position != i) {position = i;for (int j = i + 1; j < arrayData.length; j++) // 找出更小的数字,并且position++{if (arrayData[j] < value) {position++;}}// 去除重复while (value == arrayData[position]) {position++;}temp = arrayData[position];arrayData[position] = value;value = temp;}}}
}

时间复杂度:

O(n2)

空间复杂度:

O(1)

稳定性:

不稳定

从代码中其实我们能看出来,圈排序在n2复杂度中算是比较慢的,所以我感觉圈排序只能作为一种思考供我们参考,不是很实用。

参考

http://rosettacode.org/wiki/Sorting_algorithms/Cycle_sort#Java

http://en.wikipedia.org/wiki/Cycle_sort

http://www.cnblogs.com/kkun/archive/2011/11/28/2266559.html

转载于:https://www.cnblogs.com/hark0623/p/4363632.html

Hark的数据结构与算法练习之圈排序相关推荐

  1. Hark的数据结构与算法练习之锦标赛排序

    算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...

  2. Hark的数据结构与算法练习之珠排序

    ---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦.  大家看一 ...

  3. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

  4. Hark的数据结构与算法练习之希尔排序

    算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...

  5. Hark的数据结构与算法练习之计数排序

    算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...

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

    算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将1 ...

  7. Hark的数据结构与算法练习之耐心排序

    算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...

  8. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  9. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

最新文章

  1. 部署可扩展的目标检测管道:推理过程(下)
  2. python 调用c/c++
  3. python interactive 清空内存_Python 内存回收问题
  4. Linux内核分析---进程的创建,执行与切换
  5. 通过jconsole监控tomcat JVM 内存、线程、CPU
  6. spring观察者模式_Spring事件的观察者模式
  7. 【转】GigE Vision简介
  8. aws java mysql_java - AWS EC2 / MySql - spring boot无法从datasource确定jdbc url - 堆栈内存溢出...
  9. unixodbc mysql安装_ubuntu12下安装unixODBC(mysql)
  10. Java instanceof用法
  11. 京东全链路压测军演系统(ForceBot)架构解密
  12. Session持久化
  13. linux替换空格、
  14. 腾讯防水墙php接入,PHP实现腾讯防水墙验证码校验
  15. 没有卑微的工作,只有卑微的工作态度
  16. P2440 木材加工
  17. 在Unity中通过NGUI UITexture制作动态聊天表情
  18. STM32CubeIDE 介绍及安装
  19. Python札记 -- 切片赋值
  20. stanza和DBPedia的安装与使用

热门文章

  1. 评点2021-2022年上市的那些Go语言新书
  2. 刚刚,北大智能学院成立!AI视觉泰斗朱松纯教授任院长
  3. matlab进行ai研究,人工智能AI的主要内容和AI有哪些研究方法及一些MATLAB仿真的详细说明...
  4. 8个酷炫的GitHub技巧
  5. Ardupilot移植经验分享(1)
  6. PS 移动工具和复制
  7. 电脑用户没有admin权限,如何配置node开发环境
  8. 腾讯云轻量应用服务器部署Aria2+AriaNg下载工具
  9. 感谢中本聪!也感谢扎克伯格!
  10. 【Tornado】| 扫码签到系统雏形及思路