插入排序的一个弊端,就是在插入过程中,我们是将后面的元素依次与前面的元素按照从后往前的顺序比较,一旦一个很小的元素在序列最后,那么它要比较的次数就会很多,这个问题在希尔排序中得到了解决。
希尔排序思路如下:
在进行插入排序时,不再只是对该组序列整体进行插入排序,而是将序列分组,在每个组内进行插入排序
分组思路是这样的:
假设序列长度为n,序列为{3, 1, 2, 4, 5}
第一轮以n/2=5/2=2为增量,从arr[0]开始对数组进行分组,分为{3, 2, 5}, {1, 4},每组内进行插入排序,得到{2,3,5},{1,4};
第二轮以第一轮增量的一半2/2=1为增量,从arr[0]开始对数组分组,分为{2,1,3,4,5},再进行插入排序,得到{1,2,3,4,5};
第二轮增量除以2等于0,则不再进行分组。
图解如下:

通过上述按照增量进行分组,然后组内进行插入排序,可以快速实现数组后面较小的元素插入到前面,效率相比插入排序提高了很多。其实希尔排序就是在插入排序外层加了一个控制增量(gap)。

#include <stdio.h>
#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//希尔排序过程
//函数参数:arr_待排序数组,n_数据总个数-1,ipos_待排序数据中第一个元素下标,istep_步长
void groupsort(int *arr,int n,int ipos,int istep){int itemp;  //记录要与前面元素比较的元素的值int ii;int jj;for(ii = ipos+istep;ii < n;ii = ii+istep){itemp = arr[ii]; for(jj = ii-istep;jj >= 0;jj = jj-istep){if(arr[jj]<itemp) break;arr[jj+istep] = arr[jj];}//当itemp最小时,jj+istep为最小下标0;当itemp最大时,jj+istep为iiarr[jj+istep] = itemp;}
}void shellsort(int *arr,unsigned int n){int ii,istep;for(istep = n/2;istep>0;istep = istep/2){for(ii = 0;ii < istep;ii++){groupsort(arr,n,ii,istep);}}
}int main(int argc, char *argv[]) {int arr[] = {5,3,2,6,8,1};shellsort(arr,sizeof(arr)/4);int n;for(n = 0;n<(sizeof(arr)/4);n++){printf("%d ",arr[n]);}return 0;
}

希尔排序(c语言实现)相关推荐

  1. 希尔排序(C语言简单实现)

    希尔排序(C语言简单实现) 希尔排序是直接插入排序的升级版,直接插入排序每次增量是1,但希尔排序的增量increment比1大,也就是说直接插入排序是一个一个比较的,但是希尔排序是跳着来的,从而实现顺 ...

  2. 希尔排序c语言,希尔排序(C/C++实现)

    封装成函数: //交换数组元素 void swap(int *a,int i,int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //希尔排序 void s ...

  3. matlab实现希尔排序,C语言希尔排序算法

    用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 实现过程: (1)自定义函数 shsort(),实现希尔排序. (2) main() ...

  4. 希尔排序 C语言实现

    希尔排序 希尔排序( Shell's Sort)又称"缩小增量排序"( Diminishing Increment Sort),是插入排序的一种, 因D.L.Shell 于1959 ...

  5. 希尔排序(Shell's Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 希尔排序(Shell's Sort)又称"缩小增量排序"(Diminis ...

  6. 希尔排序及C语言实现

    排序系列之(4)希尔排序及C语言实现 收藏 希尔排序(Shell Sort)也称为递减增量排序算法,是插入排序的一种高速而安定的改良版.因希尔(Donald L. Shell)于1959年提出而得名. ...

  7. C语言希尔排序(解析)

    C语言希尔排序(解析) 网上找的移动图:

  8. 【经典回放】多种语言系列数据结构算法:希尔排序(C/C#版)

            原理:每隔sp(整数)个数即取数并判断大小,交换,先构造局部有序序列,直到sp为1,构造完整的有序序列. 给出一组数据,如下: 0 1 2 3 4 5 6 7 8 9 49 38 65 ...

  9. 图解,C语言希尔排序

    希尔排序和插入排序很相似,有点像插入排序的升级版本. 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本 ...

最新文章

  1. GitHub代码一键转VS Code:只需+1s
  2. lnmp1.4上thinkphp5.0出现404的解决办法
  3. Angular应用ng serve命令行的学习笔记
  4. failed to initialize nvml driver/library version mismatch ubuntu
  5. Azure 命令行工具大混战,都是什么,该选哪个?
  6. 使用Encog,ROME,JSoup和Google Guava进行博客分类
  7. 什么是485中继器,RS-485中继器产品介绍
  8. (转)腾讯2011.10.15校园招聘会笔试题
  9. 痛失 3000 万美元比特币现金,只因一张 SIM 卡?
  10. “box-shadow”属性(转)
  11. python在linux编程_python要在linux下编程吗
  12. python复制包到其他环境_Python虚拟环境导出包安装到另一台电脑的方法
  13. Linux 下修改数据库密码
  14. 关于3D打印文件格式:STL、OBJ、AMF、3MF的详解
  15. Newton-Cotes 公式及代码
  16. uniapp小程序实现开屏页
  17. 计算机英语boot,电脑开不了机显示英文boottmgr
  18. 手机断触怎么办_手机屏幕断触怎么办?弹片微针模组解决手机屏幕测试难题
  19. 小程序设置渐变色背景
  20. 日常工作要想有效提高工作效率 常用的在线工具网站

热门文章

  1. Cmake 配置 arm-oe-linux-gnueabi-gcc 交叉编译
  2. poi导入excel日期处理_POI处理Excel中各种日期格式问题
  3. 响应式织梦模板工业机械设备类网站
  4. Oracle根据当前时间获取最近5年,最近6个月,最近30天的时间
  5. 这份 Android 性能优化手册 对标大厂!
  6. 藏不住啦~SOA竟在我身边? 浅谈CANoe实现SOA仿真测试
  7. 解读通往8K/3D VR直播之路
  8. 多表查询时,执行速度耗时太多
  9. 朋友圈不知你看到的那么简单,千万Feed流系统的存储技术解密
  10. 软件测试工程师就业前景如何