排序算法 之 (希尔排序)
10.2、希尔排序
希尔排序的思想就是直接插入排序的升级版本;
把待排序的数组元素分为n个部分,对每个部分进行直接插入排序,然后把n减小继续重复,直到n=1时候,再进行n=1这一次就可以结束了。
注意:希尔排序不具备稳定性。
希尔排序的图示
希尔排序的代码实现
#include <stdio.h>
#include <stdlib.h>
#define boolean int
#define false 0;
#define true 1;
//希尔排序:nums:待排序数组,length:数组长度
boolean ShellSort(int nums[],int length){
if(length == 0) return false;
int temp;
for(int d = length/2;d >= 1;d = d/2){//希尔排序的次数
for(int i = d;i < length;i++){//每次排序
if(nums[i-d] > nums[i]){
temp = nums[i];
int j;
for(j = i-d;j >= 0 && temp < nums[j];j -= d ){//根据步长依次往后移动
nums[j+d] = nums[j];
}
nums[j+d] = temp;
}
}
}
return true;
}
int main(){
int nums[] = {49,38,65,97,76,13,27};
int length = 7;
printf("希尔排序前:");
for(int i = 0; i < length ;i++){
printf("%d ",nums[i]);
}
ShellSort(nums,length);
printf("\n");
printf("希尔排序后:");
for(int i = 0; i < length ;i++){
printf("%d ",nums[i]);
}
return 0;
}
//结果:
希尔排序前:49 38 65 97 76 13 27
希尔排序后:13 27 38 49 65 76 97