插入排序与shell排序(希尔排序)
1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方。
插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入。不断重复上述过程,即可完成操作。
图解示例

//插入排序
//karllen @2015
void insertSort()
{
int i ,j ,temp;
for(i = ;i<n;++i) //从第二个元素开始插入
{
temp = a[i]; //a[i]会被覆盖,临时保存
j = i - ;
while(j>=&&a[j]>temp) //边移动边比较
{
a[j+] = a[j];
}
a[j+] = temp;
}
}
2 .shell 排序算法是插入排序算法的一种,希尔排序先要将排序的一组数据按照某个增量分成若干组,相隔增量个的元素组成一组分别进行
插入排序,然后缩小增量,不断重复上述过程。直到将增量减小到1时,整个要排序的结果只能分成一组,并对其进行插入排序,即可完成。
图解示例:

取增量组为{3,2,1};
增量为3时,分为三组{70,10,90,60},{30,80,100,45},{40,20,75}分别进行插入排序,结果为
{10,60,70,90}
{30,45,80,100}
{20,40,75}; 执行完增量为3的分组插入排序后,结果为{10,30,20,60,45,40,70,80,75,90,100}局部有序性增强。
增量为2时,{10,30,40,60,45,20,70,80,75,90,100}被分为两组,{10,20,45,70,75,100},{30,60,40,80,90}分别进行插入排序,结果为
{10,20,45,70,75,100}
{30,40,60,80,90};执行为增量为2的分组插入排序后,结果为{10,30,20,40,45,60,70,80,75,90,100}局部有序性进一步增强。
最后执行增量为1的直接插入排序,结果为{10,20,30,40,45,60,70,75,80,90,100}至此shell排序结束。
要点:分组进行插入排序的过程目的是使数据朝着局部有序的方向发展。
这里涉及增量的选取,增量的选取理论上应该是两两互素的。
代码如下:
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
// karllen
//2015
void shellSort(int *a,int length); //希尔排序
int main(int argc, char** argv)
{
int a[] = {,,,,,,,,,,};
shellSort(a,);
for(int i = ;i<;++i)
{
std::cout<<a[i]<<" ";
}
return ;
}
void shellSort(int *a,int length) //希尔排序
{
for(int incrt = length/; incrt>;incrt /= )
{
for(int i = ;i<incrt;++i) //依次排序不同增量构成的子序列
{
/*int j = i+incrt;
int r;
while(j<length) //普通插入排序,先比较后移动
{
r = i;
while(a[j]>a[r])
{
r = r+incrt;
}
if(r!=j)
{
int temp = a[j];
int k = j;
while(k>=r)
{
a[k] = a[k-incrt];
k -= incrt;
}
a[r] = temp;
}
j = j+incrt;
} */
//改进后的直接插入排序,边移动边比较。
int j = i+incrt;
int r,temp;
while(j<length)
{
r = j-incrt;
temp = a[j];
while(r>= && a[r]>temp) //从后往前边移动边比较
{
a[r+incrt] = a[r];
r = r-incrt;
}
a[r+incrt] = temp; // 插入
j = j+incrt; // 转入下一元素的插入过程
}
}
}
}
测试结果:

书到用时方恨少,是非经过不知难。 博观而约取,厚积而薄发。@karllen 每天进步一点点。
插入排序与shell排序(希尔排序)的更多相关文章
- C语言实现 冒泡排序 选择排序 希尔排序
// 冒泡排序 // 选择排序 // 希尔排序 // 快速排序 // 递归排序 // 堆排序 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h& ...
- 排序 —— 希尔排序(Shell sort)
希尔排序(Shell sort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障(冒泡和插入排序,基于相邻元素的交换)的第一批算法.希尔排序改进了冒泡和插入排序的相邻元素才进行 ...
- Shell Sort(希尔排序)
这个排序算法很厉害,我个人很喜欢这个算法,但算法的时间复杂度难计.算法对增量(这里也称作step(步长))的选择也需要注意,只记得个希尔增量的最坏情况为O(n^2).Hibbard增量的最坏情况为O( ...
- 排序---希尔排序Java
希尔排序 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...
- Java数据结构之排序---希尔排序
希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 希尔排序(Shell)
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
- 排序算法--希尔排序(Shell Sort)_C#程序实现
排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...
- 希尔排序——Shell Sort
前言: 数据序列1: 13-17-20-42-28 利用插入排序,13-17-20-28-42. Number of swap:1;数据序列2: 13-17-20-42-14 利用插入排序,13-14 ...
随机推荐
- 如何使用XAMPP本地搭建一个属于你自己的网站
你好,从今天开始,我将为大家带来一些我学习SEO和建站的免费教程,今天为大家带来的是如何用XAMPP搭建一个属于你自己的网站.来到这里,可以说很多在百度上已经过时了的资料需要总结的资料这里都有,你只要 ...
- 前端之JavaScript
JavaScript JavaScript 是一种轻量级的编程语言:是可插入 HTML 页面的编程代码:JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行. 一,编写方式 1.Ja ...
- js和jQuery前台校验文件大小
1.支持Google 不支持IE <script type="text/javascript" src="${pageContext.request.context ...
- android 自定义组合控件 顶部导航栏
在软件开发过程中,经常见到,就是APP 的标题栏样式几乎都是一样的,只是文字不同而已,两边图标不同.为了减少重复代码,提高效率, 方便大家使用,我们把标题栏通过组合的方式定义成一个控件. 例下图: 点 ...
- Haar特征
转自:http://blog.csdn.net/carson2005/article/details/8094699 Haar-like特征,即很多人常说的Haar特征,是计算机视觉领域一种常用的特征 ...
- 使用git管理github上的项目
使用git可以把我们的项目代码上传到github上面去,方便自己管理,如何使用git?觉得是每位程序猿所必需要有的谋生技能,所以在此记录一下自己学会使用的这个过程: 一.需要注册github账号,这样 ...
- Filter Blue Light for Better Sleep(APP 推荐)
Filter Blue Light for Better Sleep By Carolyn Mohr11 May, 2016 Many people like to use their phones ...
- Flash视频播放器开发经验总结
HTTP协议更优 目前几乎所有的视频点播网站全部采用HTTP协议传输数据.因为相对于诸如RTMP等协议来说,HTTP协议是无状态的,数据传输完毕就断开连接,这样服务器就可以腾出资源来服务更多的用户.而 ...
- Flex4 自定义通用的ImageButton
Flex4与之前版本的一个极大区别就是外观皮肤的分离,虽然进一步解耦,但存在一个不爽的地方就是增加了编码的工作量,你能想象为你的每个自定义组件都写一个对应的皮肤吗?可能仅仅和你之前写过的组件差了那么一 ...
- mysql中case用法
如上所述,使用case的子句将作为一个字段,方便起见,可以用别名表示.其中,when是case的条件,值为then的表达式值. 参考: http://www.owe-love.com/myspac ...