希尔排序

核心思想是化远为近:
1.使查找次数减少
2.从而移动元素的次数减少

文章目录

  • 希尔排序
  • 动画引入
  • 一、希尔排序的代码(两个函数实现)
  • 二、希尔排序(一个函数实现)
  • 总结

动画引入

提示:颜色相同的为一组,观察动画可知,每一轮其实都是多组的插入排序,越到后面越有序。


一、希尔排序的代码(两个函数实现)

// 希尔排序,arr是待排序数组的首地址,len是数组的大小。
void shellsort(int *arr,unsigned int len)
{int i,istep;// istep为步长,每次减为原来的一半取整数,最后一次必定为1。for (istep=len/2;istep>=1;istep=istep/2){// 共istep个组,对每一组都执行插入排序。i表示每一组的首元素for (i=0;i<istep;i++){groupsort(arr,len,i,istep);}}
}
// 对希尔排序中的单个组进行排序。
// arr-待排序的数组,len-数组总的长度,ipos-每组的起始元素,istep-分组的步长(增量)。
void groupsort(int *arr, int len, int ipos,int istep)
{int temp;  // 当前需要排序的元素的值。int i;    // 需要排序元素的计数器。int j;    // 插入排序时,需要后移元素的计数器。for (i=ipos+istep;i<len;i=i+istep) {temp=arr[i];    // 待排序元素// 从已排序的最右边开始,把大于当前排序的元素后移。for (j=i-istep;(j>=0&&arr[j]>itmp);j=j-istep){arr[j+istep]=arr[j];  // 逐个元素后移。}arr[j+istep]=temp; // 插入当前排序元素。}
}

这边用了两个函数实现,意在让代码更易理解,groupsort函数负责把每次步长不同的分组情况进行排序。(进阶版的插入排序代码)
shellsort函数负责传入每次分组的步长和每组的首元素。外层for循环每循环一次就重新进行了一次分组,而里层for循环会对每次分完组后的各个组别进行排序,当步长更新为1时则代表只有一个组了,也就是普通的插入排序了,经过之前不断的分组排序使得最后的这一次普通的插入排序需要查找的数据大大减少。这就是所谓的化近为远,使得查找次数减少,最终的时间复杂度是O(NlogN)
这样分组后一组一组进行排序更为明朗。

二、希尔排序(一个函数实现)


int* shellsort(int* nums, int numsSize){/*再次巩固:与普通插入排序唯一的不同在于,由增量设置了多个组别,对每组分别进行插入排序,第一次分组组别跨度大,每组查找次数就少,然后使得整体有序,第二次分组使之更有序,以此类推可利用局部有序降低后面的查找次数,到每组步长为1的时候就完全是原来的插入排序了,但是此时的数据肯定是非常有序的,使得每次插入的查找时间大大降低*/for(int istep = numsSize/2;istep>=1;istep=istep/2){for(int i=istep;i<numsSize;i++) {//让i初始化为istep意为跳过该次分组的全部的首元素,以便得出待排元素
//i为待排元素计数器,j为待移元素计数器int temp = nums[i],j;
/*下面的操作就和普通的插入排序一模一样了,边扫描边挪动前面已排好的元素
(扫描到小于或者等于该待插元素,则表明正确插入位置就在其后)*/for(j = i-istep;j>=0&&temp<nums[j];j-=istep){nums[j+istep] = nums[j];}nums[j+istep]=temp;}} return nums;
}

实际这个用一个函数实现的希尔排序,就是之前用两个函数实现希尔排序的整合,实际是完全一样的效果,不一样的点在于它每次不止排一组而是该步长情况下的所有组别都进行了插入排序,若是用刚刚那两个函数来实现相同的操作,只需要修改groupsort函数,让其实现同理跳过所有组别的首元素,这样就不需要传入ipos参数了,只传入步长istep即可。


总结

希尔排序就是一种分组的插入排序,利用分组来实现对数据的局部有序化,然后最后再进行一次普通的插入排序,这时候查找和移动的次数就会大大减少。
代码实现这一块,需要记住:
1.istep实现步长的不断更替。
2.i 实现待排元素计数器(一般从组别的第二个元素开始)
3.j 实现待移动元素计数器(退出循环后的j+1一般就是该待排元素的位置)

希尔排序大详解,保证10分钟内学会希尔排序(进化版插入排序)相关推荐

  1. 十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

    文章目录 一.冒泡排序 1.1 冒泡排序基础[必会知识] 1.2 冒泡排序优化 1.2.1 外循环优化 1.2.2 内循环优化 1.2.3 双向遍历 1.3 冒泡排序的稳定性.复杂度和适用场景 1.3 ...

  2. Raft 协议原理详解,10 分钟带你掌握

    之前写了一篇文章<肝了一个月的ETCD,从Raft原理到实践>,干货真的很多,但是无人转载,同事说文章太长了,不方便阅读.那这篇文章,我只选取里面的 Raft 协议,精华提炼,可读性更强! ...

  3. 十大经典排序算法详解

    本文转自 <卢明冬的博客> 文章目录 排序算法的分析和评价 2.十大排序经典算法总览 2.1 排序算法的分类 2.2 排序算法的性能 2.3 各阶复杂度性能对比 2.4 排序算法的初始状态 ...

  4. 如何利用一维数组实现二维数组的多列自由升降序排序过程详解

    如何利用一维数组实现二维数组的多列自由升降序排序过程详解 本例只说明多列排序的实现方式,一维数组的排序已经有过讲解不在赘述.所以本文是在已经完成了一维数组排序的函数封装的基础上完善多列排序的过程的详解 ...

  5. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  6. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  8. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

  9. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

最新文章

  1. 静态页转换平台(StaticPol)-静态页生成终极解决方案
  2. python处理excel表格实例-python2 对excel表格操作完整示例
  3. ThreadLocal的原理与使用
  4. 用C语言编写贪吃蛇项目描述,刚学C语言,想写一个贪吃蛇的代码
  5. linux crontab结束,linux – Crontab:有开始和结束时间的日志吗?
  6. MySQL高级-SQL优化步骤
  7. PKU/POJ 2054 Color a Tree
  8. 从零基础入门Tensorflow2.0 ----八、41. estimator分布式实战
  9. GridView.RowCommand 事件
  10. python while循环语句
  11. 用UltraISO刻录CDDVD系统光盘的图文教程
  12. 一个非常好用的插件-FeHelper
  13. eclipse汉化版与背景更换更换jdk及项目jre以及环境变量的配置
  14. 数字电路基础知识(三) 复位设计-异步复位,同步释放
  15. 【学习笔记】seckill-秒杀项目--(10)安全优化
  16. 多线程编程与资源同步API和示例
  17. 谈读《三国志》之话说关羽——【istrangeboy精品史评】
  18. 如何打开python的终端窗口,python程序窗口怎么打开
  19. SLAM在机器人中的应用
  20. 蚂蚁金服 CTO 程立新加坡演讲:小蚂蚁是如何“爬”上区块链的?

热门文章

  1. python有哪些细节描写_细节描写的句子有哪些
  2. 计算机 绘图 教案,计算机绘图教案.doc
  3. 2021秋招面试经历----硬件工程师
  4. 欧姆龙服务器显示oE,在公网如何配置OE客户端
  5. 2021寒假MISC打卡DAY2
  6. 学习笔记之范海鹰微表情识别
  7. 如果用SEO来优化好论坛,提高排名
  8. 【详解】远程采矿,智慧矿采如何实现
  9. React-简书项目
  10. MVCC和快照读丶当前读