算法说明

圈排序是选择排序的一种。其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字。根据比较移动到不需要移动时,就代表一圈结束。最终要进行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

Hark的数据结构与算法练习之圈排序的更多相关文章

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

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

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

    算法说明 Bogo排序是交换排序的一种,它是一种随机排序,也是一种没有使用意义的排序,同样也是一种我觉得很好玩的排序. 举个形象的例子,你手头有一副乱序的扑克牌,然后往天上不停的扔,那么有一定机率会变 ...

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

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

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

    算法说明梳排序是交换排序的一种,它其实也是改自冒泡排序,不同之处是冒泡排序的比较步长恒定为1,而梳排序的比较步长是变化的. 步长需要循环以数组长度除以1.3,到最后大于等于1即可. 光说可能比较抽象, ...

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

    算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下 ...

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

    算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从 ...

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

    算法说明 假设煎锅里边有N个煎饼摞在了一起,它们大小不一并且顺序不一致,我们需要通过拿铲子将它们不停的翻个,进行排序,最终得到一个底下是大的煎饼,上边是小的煎饼的序列.这个排序的过程就是煎饼排序. 这 ...

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

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

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

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

随机推荐

  1. python闭包小例子

    ------------------ 首先根据实例, 体会一下闭包的效果 ------------------ 定义闭包: def foo(x): a = [0] def bar(y): a[0] = ...

  2. iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#

    更新时间2014年11月13日  本博文创建时,只有Xcode6.0, Xcode6.0尝试多次,确实如此 之后在6.1版本经博主少量尝试,确实也有如下问题,现更新下博客! iOS8发布之后,苹果强制 ...

  3. Sql将逗号分隔的字符串分拆成表格的方法

    --拆分的方法有很多,临时表.SUBSTRING ...但都不如XML来得清凉爽快 ) set @tempstr='54,57,55,56,59' declare @Xmlstr xml set @X ...

  4. Stanford机器学习---第一讲. Linear Regression with one variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7691571 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  5. win7/ubuntu双系统下,如何恢复成win7引导及卸载ubuntu

    电脑原来是win7系统,后来通过硬盘安装了Ubuntu,同时把Ubuntu设置成了开机引导项(开机时选择操作系统的界面成了紫色背景白色字体的界面),ubuntu引导开机的缺点是将来要卸载Ubuntu时 ...

  6. 学习jquery mobile

    学习jquery mobile的时间不是很长,在学习的过程当中也遇到了很多令人抓狂的问题,在网上搜索问题答案的时候发现,现在关于jquery mobile的文章还不是很多,所以,我也是一边学习,一边摸 ...

  7. 【Spring】Spring系列5之Spring支持事务处理

    5.Spring支持事务处理 5.1.事务准备 以上代码结构与AOP的前置通知.返回通知.异常通知.后置通知一样. 5.2.声明式事务 5.2.1.基于注解 5.2.2.基于配置文件 5. 3.事务传 ...

  8. 【Hibernate】Hibernate系列7之二级缓存

    二级缓存 7.1.概述 7.2.配置方法

  9. Timer1控件的属性

  10. HDU 1521 排列组合 指数型母函数

    排列组合 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status D ...