希尔排序的思想是按照一个递减的方法进行排序,其本质是分组插入排序,举例:如有9个待排序数,取初始步长为5,按照5,3,1 的递减顺序进行排序,每一轮即将位置1和位置6,位置2和位置7,位置3和位置8,位置4和位置9进行排序;第二轮步长为3,则将位置1,4,7,位置2,5,8,位置3,6,9分别进行排序;第三轮则步长为1,则和一般的排序一样,不过经过前两轮,数据已局部有序,故可以采用交换次数少的冒泡排序,当然了其他的排序也可以。
代码如下:
//step为初始步长,取奇数
void shell_sort(ElemType array[],int length,int step){
int inner,outer,median;
int i,j;
if(array == NULL || length == 0)
exit(0);
//步长每次减2,直到变为1
for(; step >= 1; step-=2){
for(i = 0; i < step; i++){
//取出最后一个元素下标
outer = i;
while((outer + step) <= (length -1)){
outer += step;
}
//对相应位的元素进行排序,采用冒泡排序
for(; outer >= (i + step);outer -= step){
for(inner = i; inner < outer; inner += step){
if(array[inner] > array[inner+step]){
median = array[inner];
array[inner] = array[inner+step];
array[inner+step] = median;
}
}
}
}
}
}