算法说明
梳排序是交换排序的一种,它其实也是改自冒泡排序,不同之处是冒泡排序的比较步长恒定为1,而梳排序的比较步长是变化的。

步长需要循环以数组长度除以1.3,到最后大于等于1即可。

光说可能比较抽象,所以实例举个例子可能会好些,这里使用的例子从这里转载过来的

假设待数组[8 4 3 7 6 5 2 1]

待排数组长度为8,而8÷1.3=6,则比较8和2,4和1,并做交换

[8 4 3 7 6 5 2 1]

[8 4 3 7 6 5 2 1]

交换后的结果为

[2 1 3 7 6 5 8 4]

第二次循环,更新间距为6÷1.3=4,比较2和6,1和5,3和8,7和4

[2 1 3 7 6 5 8 4]

[2 1 3 7 6 5 8 4]

[2 1 3 7 6 5 8 4]

[2 1 3 7 6 5 8 4]

只有7和4需要交换,交换后的结果为

[2 1 3 4 6 5 8 7]

第三次循环,更新距离为3,没有交换

第四次循环,更新距离为2,没有交换

第五次循环,更新距离为1,三处交换

[2 1 3 4 6 5 8 7]

[2 1 3 4 6 5 8 7]

[2 1 3 4 6 5 8 7]

三处交换后的结果为[1 2 3 4 5 6 7 8]

交换后排序结束,顺序输出即可得到[1 2 3 4 5 6 7 8]

代码

使用的是java

package hark.sort.exchangesort;/** 梳排序*/
public class CombSort {public static void main(String[] args) {int[] arrayData = { 5, 3, 2, 4, 3, 1, 2, 1, 4, 2, 4, 21, 6, 3, 2, 1 };CombSortMethod(arrayData);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}public static void CombSortMethod(int[] arrayData) {float shrink_factor = 1.3f;int length = arrayData.length;int temp;int stepSize = (int) (arrayData.length / shrink_factor);  //步长变化,除以1.3while (stepSize >= 1) {  //步长大于等于1for (int i = 0; i < length; i++) {if (i + stepSize >= length) { // 如果超出数组长度,就break跳出break;}if (arrayData[i] < arrayData[i + stepSize]) {temp = arrayData[i];arrayData[i] = arrayData[i + stepSize];arrayData[i + stepSize] = temp;}}stepSize = (int) (stepSize / shrink_factor);  //步长变化,除以1.3}}
}

时间复杂度:

O(nlog2n)

空间复杂度:

O(1)

稳定性:

非稳定

参考

http://zh.wikipedia.org/wiki/%E6%A2%B3%E6%8E%92%E5%BA%8F

http://www.cnblogs.com/kkun/archive/2011/11/23/2260293.html

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

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

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

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

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

    算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Lua基础之字符串(string)
  2. python字典get计数_python字典中的get方法与setdefault方法
  3. SecondarySort 原理
  4. 学python最好的方式-你们都是怎么学 Python 的?
  5. 【机器学习基础】数学推导+纯Python实现机器学习算法22:最大熵模型
  6. Linux C高级编程——时间编程
  7. 用循环语句求2^0+2^1+........+2^63 (C语言)
  8. ArcGIS:ArcToolBox工具使用——提取DEM/DSM中的高程点
  9. sql设为简单模式sql_SQL模式演练
  10. Thingsboard 3.1.0 - windows下安装、发送mqtt、仪表板显示
  11. 指标公式c语言源码下载,通达信最全指标公式源码,给大家分享实用的技术指标...
  12. 第三方app实现微信登录功能
  13. UE4_编辑器UMG关闭窗口不能立刻销毁UMG
  14. 语义分割工具EISeg
  15. C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)
  16. kubeadm 方式搭建k8s笔记
  17. awk和sed命令详解
  18. 双臂魔方机器人的学习
  19. 2021高考成绩查询理综各科得分,2021高考一共几科 总分多少分
  20. php表格单元格怎么实现排序,excel表格数据怎么自动排列-excel表格如何实现自动排序...

热门文章

  1. 区块链 共识机制研究的重要定理有哪些
  2. 微信小程序云开发教程-产品原型的意义
  3. android.jar 位置,Android 导入jar包 so模块--导入放置的目录
  4. java8—Stream
  5. Scala之flatMap操作
  6. kafka 安装,使用教程
  7. Ubuntu 手动挂载U盘
  8. sql插入时返回插入主键id(id位自动增长)
  9. iptables与Netfilter概念
  10. ELementD对象