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 }