插入排序之希尔(shell)排序
2016-10-02 10:34
176 查看
希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序。
基本思想:
选择一个增量序列t1,t2,ti…tj,...,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子序列进行直接插入排序。当增量ti为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
希尔排序的示例:
![](http://img.blog.csdn.net/20161002151022880?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
算法实现:
我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数
即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。
外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。
基本思想:
选择一个增量序列t1,t2,ti…tj,...,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子序列进行直接插入排序。当增量ti为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
希尔排序的示例:
算法实现:
我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数
即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。
#include <iostream> using namespace std; void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } void shell_insert_sort(int a[], int n, int dk) { for(int i= dk; i<n; ++i){ if(a[i] < a[i-dk]){ //若元素i大于元素i-dk,则不需插入。小于的话,移动有序表后插入 int j = i-dk; int x = a[i]; //复制为哨兵,即存储待排序元素 while(x < a[j]){ //查找在有序表的插入位置 a[j+dk] = a[j]; j -= dk; //元素后移 } a[j+dk] = x; //插入到正确位置 } print(a, n,i );//i为位置 } } /** * 先按增量d(n/2,n为要排序数的个数)进行希尔排序 */ void shell_sort(int a[], int n){ int dk = n/2; while( dk >= 1 ){ shell_insert_sort(a, n, dk);//完成一趟排序 dk = dk/2; } } int main(){ int a[12] = {3,1,5,7,2,4,9,6,0,10,11,8}; shell_sort(a,12); //希尔插入排序 print(a,12,12); }希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1
外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。
相关文章推荐
- 插入排序和希尔(Shell)排序
- 数据结构笔记:插入插入排序、折半插入排序、shell(希尔)排序
- 【排序算法】直接插入排序与希尔(Shell)排序
- 希尔(shell)排序-插入排序的扩展
- 排序算法大集锦_插入类――希尔(shell)排序
- 排序算法大集锦_插入类——希尔(shell)排序
- 插入排序(直接插入排序和希尔(shell)排序
- 排序专题(八) / 不稳定的内部排序 / 希尔(shell)排序
- 数据结构与算法分析10(排序-插入、冒泡、希尔、堆、归并)
- 基本排序(二)插入排序(直接插入、Shell、折半)
- c# 排序 算法 函数 冒泡 选择 插入 希尔
- Java 详解希尔(Shell)排序
- C语言常用排序——直接插入,冒泡,选择,希尔,快速,堆排序
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 七种排序(直接插入、折半插入、希尔、起泡、快速、简单选择、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 插入、希尔、快排、堆排、自然归并排序
- 希尔插入排序