• 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

  • 相关阅读:
    requestAnimationFrame
    js来监控复制粘贴
    nodejs事件循环
    前端路由
    js基础查漏补缺(更新)
    http & https & http2.0
    进度条方案
    移动端适配方案
    性能优化之节流、防抖
    altium designer 里如何设置PCB默认字符默认大小(PCB丝印)
  • 原文地址:https://www.cnblogs.com/hark0623/p/4363632.html
Copyright © 2020-2023  润新知