博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hark的数据结构与算法练习之圈排序
阅读量:6647 次
发布时间:2019-06-25

本文共 2022 字,大约阅读时间需要 6 分钟。

算法说明

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

你可能感兴趣的文章
手把手教你创建你的第一个 NPM 包
查看>>
Java常用数据结构之Map-AbstractMap
查看>>
给初学者的RxJava2.0教程(二)
查看>>
0-2岁的app开发人员必读,Android开发APP前的准备事项
查看>>
Excel数据分析入门-数据图表
查看>>
阿里Java开发手册思考(五)
查看>>
微服务之配置服务器切换profile
查看>>
Hibernate第十篇【Hibernate查询详解、分页查询】
查看>>
项目实战-后台管理系统(一)
查看>>
2018年小结 | 掘金年度征文
查看>>
在iOS中如何正确的实现行间距与行高
查看>>
07、React系列之 使用jspm管理
查看>>
Android WebView File域攻击杂谈
查看>>
Debug Struts2 S2-021的一点心得体会
查看>>
Java8新的异步编程方式 CompletableFuture(二)
查看>>
linux 找不到命令的解决方法
查看>>
从源码看runLoop
查看>>
我们为什么要使用 DataBinding
查看>>
Linux工具性能调优系列二:buffer和cache
查看>>
HTML、CSS、JavaScript
查看>>