希尔排序算法思想

  • 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序.

  • 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

代码

要求

对于一个int数组,请编写一个希尔排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。保证元素小于等于2000。

测试样例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]

程序一(好理解,但是比较麻烦)

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int count = 2, argument; //count:一个子序列中的元素数,argument:增量,也是子序列的数量while(count<=n){argument = n/count;for(int i=0;i<argument;i++){sortArgu(A,n,i,argument); //这里把一次插入排序过程抽出来}count *=2;}return A;}private:void sortArgu(int* A, int n, int begin, int argu){int temp, last, current;  //begin:子序列的起始元素current = begin+argu;// current: 一次插入排序中,当前要排序的元素,也就是无序部分的第一个元素while(current<n){last = current;while(last-argu>=begin){if(A[last]<A[last-argu]){temp = A[last];A[last] = A[last-argu];A[last-argu] = temp;}last -= argu;}current +=argu;}}
};

程序二

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){ //这里控制增量,最小值时为1,也就是一次普通的插入排序for(int i=step; i<n; i++){ //重点是在这里!!!这里是对第一个增量后的元素进行插入排序(插入排序时起始有序序列为1),没有把一个子序列单独抽出来进行排序(区别程序一),而是依次对第一个增量后的元素在其所属的子序列中进行插入排序for(j=i; j>=step; j-=step){if(A[j]<A[j-step]){temp = A[j];   //这里还可以进一步优化,详见程序三A[j] = A[j-step];A[j-step] = temp;}else{break;}}} }return A;}};

程序三

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){for(int i=step; i<n; i++){   //思想:找到待排序元素在有序部分的位置,然后插入,而不是每一次都把待排序元素与前一个元素交换位置。temp = A[i];     //记录下待排序元素for(j=i; j>=step; j-=step){if(temp<A[j-step]){  //有序部分的每一个元素都与待排序元素比较A[j]=A[j-step];  //满足上述条件,则元素后移}else{break;}}A[j]=temp;  //将待排序元素插入合适位置} }return A;}};

参考

1 白话经典算法系列之三 希尔排序的实现

[算法]-排序算法之希尔排序相关推荐

  1. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  2. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  3. 《大话数据结构》第9章 排序 9.6 希尔排序(下)

    9.6.3 希尔排序算法         好了,为了能够真正弄明白希尔排序的算法,我们还是老办法--模拟计算机在执行算法时的步骤还研究算法到底是如何进行排序的.         希尔排序算法代码如下. ...

  4. 12. 希尔排序,以及希尔排序的优化

    1. 什么是希尔排序 希尔排序(Shell's Sort)是插入排序的一种又称"缩小增量排序"(Diminishing Increment Sort),是直接插入排序算法的一种更高 ...

  5. 基本算法学习(一)之希尔排序(JS)

    参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...

  6. 希尔排序的java算法_Java算法系列篇 【希尔排序】

    什么? 搞Java不会算法? 由于个人兴趣原因以及工作所需,最近了解Java算法的相关案例 及时分享 感兴趣的欢迎交流 希尔排序 描述: 基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直 ...

  7. 算法与数据结构(希尔排序)

    希尔排序 Shell's Sort 我们都知道直接插入排序对有序度高的列表排序效率是比较高的.而当列表为倒序时,最后一位元素的值是最小的,直接插入排序会进行 n-1 次比较才能找到正确的位置.这种情况 ...

  8. (数据结构与算法)插入排序和希尔排序

    1. 插入排序 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序 ...

  9. 数据结构与算法 | 直接插入排序、希尔排序

    前几章讲了选择排序中的直直接选择排序.双向选择排序.堆排序,这次来讲讲利用'插入'为核心来实现的插入排序算法. 插入排序 把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所 ...

  10. shell排序_Python排序算法(五)希尔排序

    一. 核心思想 希尔排序(shell_Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本.基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录& ...

最新文章

  1. python安装modify setup选哪-python 之禅 import this
  2. Python 操作redis
  3. 模板会有多层镜像_创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建,本博文讲解前两种。基于已有镜像的容器创建该方法是使用docke...
  4. wnoise matlab,MATLAB中用wnoise函数测试去噪算法
  5. JavaScript 详解:为什么写好的代码非常重要
  6. 手机怎么快速把jpg图片中的文字提取出来
  7. 错误描述: plugin scala is incompatible
  8. javascript中的isNaN()
  9. 库仑计BQ27441使用
  10. cpu_scale/max_freq_scale/cpu_capacity/cpu_capacity_orig的含义
  11. 会计记录accton
  12. 如何使用Joplin搭建私有笔记软件
  13. 解决BMap is not defined?
  14. 【系统集成项目管理工程师】信息与信息化
  15. 关于做项目中关于文件读取遇到的一个问题(0x80070299)
  16. 【Android开发】
  17. 智能优化算法:寄生-捕食算法-附代码
  18. 推荐几个Github中国区排名前100的公众号
  19. 【C++错误】VS调试出现0xC00000FD:Stack overflow溢出
  20. 王佩丰第一讲 认识excel笔记

热门文章

  1. 江西理工大学期末试卷c语言,2016年江西理工大学信息工程学院计算机应用技术(加试)之C语言程序设计复试笔试最后押题五套卷...
  2. js删除mysql记录_(DELETEUPDATE)修改、删除数据记录_MySQL
  3. java canvas画圆圈_java – 在视图上绘制一个圆圈(android)
  4. 高中数学40分怎么办_2019年第35届全国高中数学联赛试题及参考答案
  5. 蛇形数组打印(两种形式)
  6. 《C++ Primer 第五版》(第4.1-4.11节) ——运算符的执行顺序问题,负值坐商取余问题,数值的移位操作
  7. python常用的开发环境包括_Python语言主要包括哪些集成开发环境?_学小易找答案...
  8. uboot的常用命令详解
  9. UVa11426——欧拉函数
  10. Linux网络编程---I/O复用模型之epoll