Shell排序

shell排序(希尔排序) , 基本的思想是将数据按某一分量分成几个分组 , 分别对分组进行直接插入排序 ,  然后逐渐缩小分量 ,再继续进行直接插入排序 , 。。。,如此循环下去 , 知道 衡量等于1  。  至于衡量的选择 , 至今还没有较好的解决方法 。

衡量的缩小规则  :  设初始衡量等于  gap = len/n +m   ,  缩小的时候   gap = gap/n + m

shell排序的实现

 1 typedef        struct    _tagItem{
 2     int        num[MAX_SIZE+1]; //num[0]作为监视哨
 3     int        len;
 4 }Item,*PItem;
 5 
 6 void    shell_sort(PItem    p , int flag )
 7 {        
 8     int        i = 0 , j = 0 ,gap;
 9     //循环缩小分量
10     for( gap = p->len/3  ;  gap>0  ; gap /= 3){
11         //对每个元素在其分组内进行插入排序  ,  当循环结束后,
12         //每个元素都在分组中进行了插入排序,这样相当于对每个
13         //分组都进行了插入排序
14         for(i = gap+1 ; i <= p->len ; i++){
15             if(p->num[ i - gap] > p->num[i]){
16                 p->num[0] = p->num[i];
17                 j = i;
18                 //调整元素在分组中的位置
19                 do{
20                     p->num[j] = p->num[ j-gap];
21                     j -= gap;
22                 }while(j-gap>=0&&p->num[ j-gap] > p->num[ 0]);
23                 p->num[j] = p->num[0];
24             }
25         }
26     }
27 }
原文地址:https://www.cnblogs.com/wowk/p/2958630.html