插入排序与希尔排序
来源:互联网 发布:率土之滨兵营升级数据 编辑:程序博客网 时间:2024/06/12 00:58
- 插入排序
插入排序是基于减治法的一种排序算法,其思想是若对N个数进行排序,假设前N-1个数已经有序,只需要将最后一个元素插入到合适的位置即完成排序。
虽然思想更接近于使用递归,但是使用迭代却又更高的效率。
使用迭代来实现插入排序,首先将数组第一个元素当做一个有序队列,然后将第二个元素当做插入元素插入,插入第三个元素时,前面两个当做有序序列进行插入,然后依次顺推,直到最后一个元素完成插入。
下面是代码:
void insert_sort(vector<int> & a){ if(a.empty() || a.size() == 1)//若数组为空或者元素只有一个,直接返回 return; for(int i=1;i<a.size();++i)//控制插入的元素的索引 { int num=a[i]; //保存插入元素的值 int j=i-1; for(;j>=0;j--)//从插入元素的前一个元素开始向前依次比较 { if(a[j] > num )//若不满足条件,后移 a[j+1]=a[j]; else //找到将要插入的位置 break; } a[j+1]=num; //插入 }}
插入排序的代码相对简单一些,也可以发现,使用插入排序对比较有序的数列进行排序,有着相当高的效率。
- 希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序的基本思想是:
把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
Shell排序可以看做是插入排序的一种扩展排序。
下面是我实现的Shell排序:
void shell_sort(vector<int> & a){ if(a.empty() || a.size() == 1) return; shell_sort(a,2); shell_sort(a,1);}void shell_sort(vector<int>&a,int num){ for(int i=0;i<num;i++) shell_sort(a,num,i);}void shell_sort(vector<int>& a,int num,int s){ for(int i=s + num;i<a.size();i+=num) { int n=a[i]; int j= i - num; for(;j>=0;j-=num) { if(a[j]>n) a[j+num]=a[j]; else break; } a[j+num]=n; }}
这上面有三个重载的函数,只有一个参数的函数是总的排序函数;有两个参数的函数,第二个参数代表增量,这个函数完成在该增量下的插入排序,最后的三个参数的函数的第三个参数代表插入排序的开始索引。
在这里我选择的增量为2,当然这个增量的选择看自己,这里我的实验代码的数组的大小只有6个元素,这个增量是可以接受的。
下面是实验代码:
int main(){ int b[6]={8,2,9,3,5,7}; vector<int> a; for(int i=0;i<6;i++) a.push_back(b[i]); // insert_sort(a); shell_sort(a); vector<int>::iterator p=a.begin(); for(;p!=a.end();++p) cout<< *p<<" "; cout<<endl;}
测试结果这里就不贴了,我的运行结果是正确的,你们可以试一下
0 0
- 插入排序与希尔排序
- 插入排序与希尔排序
- 插入排序与希尔排序
- 插入排序与希尔排序
- 插入排序与希尔排序
- 插入排序与希尔排序
- 排序:插入排序与希尔排序
- 数据结构之插入排序与希尔排序
- 直接插入排序与希尔排序
- 简单插入排序与希尔排序
- 数据结构-直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 插入排序与希尔排序详解
- 【算法】简单插入排序与希尔排序
- 直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 直接插入排序与希尔排序
- 插入排序--希尔排序
- Java技巧之双括弧初始化——匿名内部类的应用
- iOS应用间相互跳转
- c语言实现,如果是小写字符就输出对应的大写字符,如果是大写,就输出对应的小写字符,是数字就不输出
- web前端学习
- C# 中的 App.config 文件配置
- 插入排序与希尔排序
- 我为什么从程序员转行做了产品经理
- iOS10关于ATS的问题
- BatteryHistrian 学习
- 使用NPOI按照模版导出导入excle表
- HIVE 、DB2及GBASE 8A MPP数据类型之间的转换
- 菜鸟之关于java web项目里导出excel,word 等简单总结
- 手机客户端弱网络下的断线重连处理
- Android WebView 开发详解(一)