希尔排序
概述
希尔排序 ( Shell sort ) 属于插人类排序 , 但它对简单插入排序做了较大的改进
基本思想
将整个无序序列分割成若干小的子序列分别进行插入排序
将相隔某个增量 h 的元素构成一个子序列 ,在排序过程中 , 逐次减小这个增量
当 h 减到 1 时 , 进行一次插入排序 , 排序就完成了
注意
增量序列一般取,其中 n 为待排序序列的长度
在希尔排序过程中,虽然对于每一个子表采用的仍是插入排序,但是,在子表中每进行一次比较就有可能移去整个线性表中的多个逆序,从而改善了整个过程的性能效率
希尔排序的效率与所选取的增量序列有关,如果选取上述增量序列,在最坏的情况下,希尔排序所需要的比较次数为
示意图

程序代码
1 /** 2 ****************************************************************************** 3 * @file : shell_sort.c 4 * @brief : 希尔排序函数及其使用范例 5 ****************************************************************************** 6 * @attention 7 * 8 * 本程序参考了《计算机软件技术基础》3.3.2例程 9 * 需要注意的是,本希尔排序文件中的void main()与其他排序文件中的完全相同 10 * 希尔排序算法本体为void shell_sort(T p[],int size) 11 * 使用测试及范例在void main()中 12 * 13 ****************************************************************************** 14 */ 15 16 #include<iostream> 17 #include<iomanip> 18 19 using namespace std; 20 21 /** 22 * @brief 希尔排序函数 23 * @param p: 指向待排序数据的指针 24 * @param size: 待排序数据的个数 25 * @retval 分界线位置 26 */ 27 template<class T> 28 void shell_sort(T *p,int size) 29 { 30 int i,j,k; 31 T flag; 32 k=size/2; 33 while (k>0) 34 { 35 for(j=k;j<size-1;j++) 36 { 37 flag=p[j]; 38 i=j-k; 39 while ((i>=0)&&(p[i]>flag)) 40 { 41 p[i+k]=p[i]; 42 i=i-k; 43 } 44 p[i+k]=flag; 45 } 46 k=k/2; 47 } 48 return; 49 } 50 51 void main() 52 { 53 int i,j,k; 54 double p[50]; 55 for(i=0,j=0;i<50;i++,j++) //载入待排序序列 56 { 57 p[i]=j; 58 if(j==9)j=-1; 59 } 60 cout<<"排序前的序列"<<endl; 61 for(i=0,k=0;i<10;i++) 62 { 63 for(j=0;j<5;j++) 64 { 65 cout<<p[k]<<" "; 66 k=k+1; 67 } 68 cout<<endl; 69 } 70 cout<<endl; 71 shell_sort(p,50); 72 cout<<"排序后的序列"<<endl; 73 for(i=0,k=0;i<10;i++) 74 { 75 for(j=0;j<5;j++) 76 { 77 cout<<p[k]<<" "; 78 k=k+1; 79 } 80 cout<<endl; 81 } 82 cout<<endl; 83 }

浙公网安备 33010602011771号