Hark的数据结构与算法练习之圈排序
算法说明
圈排序是选择排序的一种。其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字。根据比较移动到不需要移动时,就代表一圈结束。最终要进行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的数据结构与算法练习之圈排序的更多相关文章
- Hark的数据结构与算法练习之锦标赛排序
算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...
- Hark的数据结构与算法练习之Bogo排序
算法说明 Bogo排序是交换排序的一种,它是一种随机排序,也是一种没有使用意义的排序,同样也是一种我觉得很好玩的排序. 举个形象的例子,你手头有一副乱序的扑克牌,然后往天上不停的扔,那么有一定机率会变 ...
- Hark的数据结构与算法练习之珠排序
---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦. 大家看一 ...
- Hark的数据结构与算法练习之梳排序
算法说明梳排序是交换排序的一种,它其实也是改自冒泡排序,不同之处是冒泡排序的比较步长恒定为1,而梳排序的比较步长是变化的. 步长需要循环以数组长度除以1.3,到最后大于等于1即可. 光说可能比较抽象, ...
- Hark的数据结构与算法练习之奇偶排序
算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下 ...
- Hark的数据结构与算法练习之鸡尾酒排序
算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从 ...
- Hark的数据结构与算法练习之煎饼排序
算法说明 假设煎锅里边有N个煎饼摞在了一起,它们大小不一并且顺序不一致,我们需要通过拿铲子将它们不停的翻个,进行排序,最终得到一个底下是大的煎饼,上边是小的煎饼的序列.这个排序的过程就是煎饼排序. 这 ...
- Hark的数据结构与算法练习之图书馆排序
算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...
- Hark的数据结构与算法练习之耐心排序
算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...
随机推荐
- LDA(Linear discriminate analysis)线性判别分析
LDA 线性判别分析与Fisher算法完全不同 LDA是基于最小错误贝叶斯决策规则的. 在EMG肌电信号分析中,... 未完待续:.....
- editplus快速定位到文章头部和尾部
经常用editplus发现有时文档比较长,要查找前面的内容时得一直滚动鼠标滚轮,或者拉动右侧边栏的导航标签,很少麻烦,有没有好的方法快速定位editplus到头部和尾部呢? 其实很简单,editplu ...
- BNU 2418 Ultra-QuickSort (线段树求逆序对)
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...
- 第19章 使用PXE+Kickstart部署无人值守安装
章节概述: 本章节将教会您通过PXE+DHCP+TFTP+VSftpd+Kickstart服务程序搭建出无人值守安装系统,从而批量部署客户机系统. 这种系统能够实现自动化运维.避免了重复性劳动,帮助提 ...
- git寻根——^和~的区别
一. 引子 在git操作中,我们可以使用checkout命令检出某个状态下文件,也可以使用reset命令重置到某个状态,这里所说的“某个状态”其实对应的就是一个提交(commit). 我们可以把一个g ...
- Linux system V
Sysvinit 的小结 Sysvinit 的优点是概念简单.Service 开发人员只需要编写启动和停止脚本,概念非常清楚:将 service 添加/删除到某个 runlevel 时,只需要执行一些 ...
- jquery.fileupload.js 杂记
通过$your_jq_dom.fileupload({},donf:function...,fail:function..., ...) 得到的只是一个支持上传的控件,当然绑定了各种事件. 传参给ur ...
- spring boot实战(第十三篇)自动配置原理分析
前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...
- C#中Const和Readonly的区别
const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...
- bootstrap的select2校验及不影响原来的格式
<style> .has-error .select2-choice, .has-error .select2-choices, .has-error.simple .select2-ch ...