希尔排序法(插入排序的改进版本)
(图片版权归原作者,下面给出的方案的时间复杂度比这个低)
希尔排序是在插入排序的基础上的一点改进,对于插入排序很熟悉的,希尔排序就很容易理解,如果插入排序不是很清楚的,可以看下插入排序的用法:插入排序
简单来说,希尔排序增加了一个参数,叫做增量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可以让复杂度降低!
希尔排序法(插入排序的改进版本)相关推荐
- 数据结构排序法之希尔排序法(Shell Sort)
希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本.希尔排序是不稳定的排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高, ...
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
一.快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解: 在R[low..high]中任选一个记录作为基准(Pivot ...
- 希尔排序法对一维数组排序
希尔排序法对一维数组排序 希尔排序(缩小增量排序),首先将整个待排序的序列分割成若干子序列,分别直接插入排序,然后再对全体记录进行插入排序. using System; using System.Co ...
- 数据结构与算法之四希尔排序法
希尔排序法的思想是:先取一个小于数组长度n的数d1作为第一个增量,把数组里面的n个数分成d1个组,数组中所有距离为d1的数都放在同一个小组中,分组过程见下图,再在各组里进行直接插入排序,然后取第二个增 ...
- 经典算法之希尔排序法(Java实现)
活动地址:21天学习挑战赛 目录 一.算法 1.算法概述 2.基本思想 3.算法步骤 4.算法特点 二.算法实践 1.Java代码 2.执行结果 三.复杂度分析 1.时间复杂度 2.空间复杂度 一.算 ...
- 常见排序算法2–直接插入法vs希尔排序法
常见排序算法–直接插入法vs希尔排序法 首先,我们通过一个例子来了解直接插入算法 例如,对原始数组{15,24,3,49,10}进行直接插入排序(由小到大进行排序) 第一个数15无法比较,第二个数24 ...
- 希尔排序法。Java实现希尔排序
前言基础: 1.因为希尔排序法的步长选取不是固定的,不同的步长会对应不同的复杂度,但是综合起来希尔排序法的时间复杂度是在O(nlogn)~O(n2)之间,近似为O(n的1.3次幂).空间复杂度为O(1 ...
- 希尔排序(插入排序的优化算法)
提到希尔排序,首先要知道插入排序.插入排序属于一种简单排序,它假设了数组中的数据部分有序,也就是说标志位左侧的数据已经有序,标志位右侧数据无序.然后用标志位与前面的数据进行比较,插入适当的位置.具体的 ...
- 数据结构上机——希尔排序(含监视哨版本)
首先要明确一下什么是监视哨 这个词很容易望文生义 错误地认为是监视比较的值 查阅资料才发现 监视哨的意义是防止下标越界,提高速度 在插入排序中, 取用r[0]作为监视哨,就可以在循环中减少一次判断j& ...
最新文章
- 自动化测试测试工具 AirTest 的使用方法与简介
- Intellij IDEA中使用Protobuf的正确姿势
- Lucene Document getBoost(float) 和 setBoost(float)
- POJ 3169 差分约束
- 微软宣布推出Azure Blockchain Tokens加密代币平台
- OpenCASCADE绘制测试线束:布尔运算命令之两个操作数的布尔运算
- 4.有关日期格式属性修改常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面可以跟:列名、表达式、别名、序号
- 8瓶酒一瓶有毒,用人测试。每次测试结果8小时后才会得出,而你只有8个小时的时间。问最少需要(B)人测试?
- Airbnb: React Native 从选择到放弃
- php5.6non thread safe 区别,PHP版本Non Thread Safe和Thread Safe如何选择?区别是什么?
- php实现把es6转为es5,如何将ES6代码转化为ES5?
- 【今日CV 视觉论文速览】19 Feb 2019
- 事件与委托的一点概念理解
- 51CTO‘s Bug?
- CentOS 7.7(1908)发布
- visual studio编译linux,在 Visual Studio 中配置 Linux MSBuild C++ 项目
- 根文件系统移植之使用busybox
- 蠕虫Sexy View短信攻击诺基亚3250等手机
- 小米销量被荣耀赶超:手机枭雄如何跌落神坛?
- 微信小游戏代码包侵权解决方案升级版
热门文章
- Luogu 3479 [POI2009]GAS-Fire Extinguishers
- 【5.0】对象生命周期及crud操作
- CVE-2012-4792Microsoft Internet Explorer 释放后使用漏洞
- Java读取Properties文件的六种方法
- 常用的Webserver接口
- php 未实例化类调用方法的问题
- 三款200万像素照相手机测评
- VisualGDB调试,实现VS环境下调试Android
- ES8新特性_ES8中对象方法的扩展---JavaScript_ECMAScript_ES6-ES11新特性工作笔记052
- JAVA零碎要点014---java+selenium环境搭建_浏览器自动化测试框架