希尔排序
设计思路:
1.判断数组元素个数,若元素个数小于等于1,直接返回,无需进行排序;
2.若元素个数大于1,进行排序值(排序值的选取直接会影响排序的时间复杂度),此次将采用希尔序列;
3.设置gap = size/2,以后每轮轮换将gap降为原来gap的一半;
4.进入循环,将数组元素一gap为间隔距离进行分组,并对各组中元素进行排序;
5.待gap等于1,并且对组中元素以及排完序时,循环结束;
6.此时的数组已经是一个有序数组。
希尔排序程序代码:
oid myshell(int array[],int64_t size){
if(size<=1){
//无需进行排序
return;
}
//数组元素个数大于1
//此时使用希尔排序
int64_t gap = size/2;
for(;gap > 0;gap/=2){
//此处相当与插入排序中的bound = 1
int64_t bound = gap;
for(;bound<size;++bound){
int bound_value = array[bound];
int64_t cur =bound;
for(;cur>0;cur-=gap){
if(array[cur-gap]>bound_value){
array[cur] = array[cur-gap];
}else{
break;
}
}//第三层循环结束
array[cur] = bound_value;
}//第二层循环结束
}//第一层循环结束
}
测试用例程序代码:
//主函数
int main(){
int arr[] = {1,6,3};
int size = sizeof(arr)/sizeof(arr[0]);
printf("排序前:");
int i = 0;
for(;i<size;++i){
printf("%d ",arr[i]);
}
printf("\n");
myshell(arr,size);
printf("排序后:");
i = 0;
for(;i<size;++i){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
测试结果显示: