(图片版权归原作者,下面给出的方案的时间复杂度比这个低)

希尔排序是在插入排序的基础上的一点改进,对于插入排序很熟悉的,希尔排序就很容易理解,如果插入排序不是很清楚的,可以看下插入排序的用法:插入排序

简单来说,希尔排序增加了一个参数,叫做增量g,我们就是使用g为间隔做插入排序(平时所说的插入排序其实可以看做g为1),逻辑上来看,是分成了很多子数组,那么ShellSort(R,len)可以看做是insertionSort(R,len,g)插入排序的循环,并在每轮循环之后逐渐缩小g的范围。

#include<iostream>
#include<vector>using namespace std;vector<int> G;//vector是向量类型,它可以容纳许多类型的数据
void insertionSort(int R[],int len,int g)
{int i,j,v;for(i=g; i<len; i++)//i:循环变量,表示未排序部分的开头元素{v=R[i];//v:循环临时保存未排序的变量j=i-g;//j:循环变量,用于在已排序部分寻找v的插入位置while(j>=0&&v<R[j]){R[j+g]=R[j];j-=g;}R[j+g]=v;}
}void ShellSort(int R[],int len)
{//生成的G数据为{1,4,13,40,121,..}for(int h=1;;){if(h>len)break;G.push_back(h);h=3*h+1;}for(int i=G.size()-1; i>=0; i--){insertionSort(R,len,G[i]);//倒序赋值给增量参数g,增量的选择很关键,决定了算法的复杂度}
}int main()
{int R[]= {2,56,1,55,22,3,0,12,99,34};int len=sizeof(R)/sizeof(R[0]);//数组长度ShellSort(R,len);for(int i=0; i<len; i++){printf("%d ",R[i]);}
}

0 1 2 3 12 22 34 55 56 99

对于增量g,网络上很多都是数组长度折半的来给定,这种时间复杂度是O(N²),所以使用其他的g可以让复杂度降低!

希尔排序法(插入排序的改进版本)相关推荐

  1. 数据结构排序法之希尔排序法(Shell Sort)

    希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本.希尔排序是不稳定的排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高, ...

  2. 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结

    一.快速排序的基本思想     设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解:     在R[low..high]中任选一个记录作为基准(Pivot ...

  3. 希尔排序法对一维数组排序

    希尔排序法对一维数组排序 希尔排序(缩小增量排序),首先将整个待排序的序列分割成若干子序列,分别直接插入排序,然后再对全体记录进行插入排序. using System; using System.Co ...

  4. 数据结构与算法之四希尔排序法

    希尔排序法的思想是:先取一个小于数组长度n的数d1作为第一个增量,把数组里面的n个数分成d1个组,数组中所有距离为d1的数都放在同一个小组中,分组过程见下图,再在各组里进行直接插入排序,然后取第二个增 ...

  5. 经典算法之希尔排序法(Java实现)

    活动地址:21天学习挑战赛 目录 一.算法 1.算法概述 2.基本思想 3.算法步骤 4.算法特点 二.算法实践 1.Java代码 2.执行结果 三.复杂度分析 1.时间复杂度 2.空间复杂度 一.算 ...

  6. 常见排序算法2–直接插入法vs希尔排序法

    常见排序算法–直接插入法vs希尔排序法 首先,我们通过一个例子来了解直接插入算法 例如,对原始数组{15,24,3,49,10}进行直接插入排序(由小到大进行排序) 第一个数15无法比较,第二个数24 ...

  7. 希尔排序法。Java实现希尔排序

    前言基础: 1.因为希尔排序法的步长选取不是固定的,不同的步长会对应不同的复杂度,但是综合起来希尔排序法的时间复杂度是在O(nlogn)~O(n2)之间,近似为O(n的1.3次幂).空间复杂度为O(1 ...

  8. 希尔排序(插入排序的优化算法)

    提到希尔排序,首先要知道插入排序.插入排序属于一种简单排序,它假设了数组中的数据部分有序,也就是说标志位左侧的数据已经有序,标志位右侧数据无序.然后用标志位与前面的数据进行比较,插入适当的位置.具体的 ...

  9. 数据结构上机——希尔排序(含监视哨版本)

    首先要明确一下什么是监视哨 这个词很容易望文生义 错误地认为是监视比较的值 查阅资料才发现 监视哨的意义是防止下标越界,提高速度 在插入排序中, 取用r[0]作为监视哨,就可以在循环中减少一次判断j& ...

最新文章

  1. 自动化测试测试工具 AirTest 的使用方法与简介
  2. Intellij IDEA中使用Protobuf的正确姿势
  3. Lucene Document getBoost(float) 和 setBoost(float)
  4. POJ 3169 差分约束
  5. 微软宣布推出Azure Blockchain Tokens加密代币平台
  6. OpenCASCADE绘制测试线束:布尔运算命令之两个操作数的布尔运算
  7. 4.有关日期格式属性修改常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面可以跟:列名、表达式、别名、序号
  8. 8瓶酒一瓶有毒,用人测试。每次测试结果8小时后才会得出,而你只有8个小时的时间。问最少需要(B)人测试?
  9. Airbnb: React Native 从选择到放弃
  10. php5.6non thread safe 区别,PHP版本Non Thread Safe和Thread Safe如何选择?区别是什么?
  11. php实现把es6转为es5,如何将ES6代码转化为ES5?
  12. 【今日CV 视觉论文速览】19 Feb 2019
  13. 事件与委托的一点概念理解
  14. 51CTO‘s Bug?
  15. CentOS 7.7(1908)发布
  16. visual studio编译linux,在 Visual Studio 中配置 Linux MSBuild C++ 项目
  17. 根文件系统移植之使用busybox
  18. 蠕虫Sexy View短信攻击诺基亚3250等手机
  19. 小米销量被荣耀赶超:手机枭雄如何跌落神坛?
  20. 微信小游戏代码包侵权解决方案升级版

热门文章

  1. Luogu 3479 [POI2009]GAS-Fire Extinguishers
  2. 【5.0】对象生命周期及crud操作
  3. CVE-2012-4792Microsoft Internet Explorer 释放后使用漏洞
  4. Java读取Properties文件的六种方法
  5. 常用的Webserver接口
  6. php 未实例化类调用方法的问题
  7. 三款200万像素照相手机测评
  8. VisualGDB调试,实现VS环境下调试Android
  9. ES8新特性_ES8中对象方法的扩展---JavaScript_ECMAScript_ES6-ES11新特性工作笔记052
  10. JAVA零碎要点014---java+selenium环境搭建_浏览器自动化测试框架