希尔排序
一、希尔排序算法思想
希尔排序是特殊的插入排序,直接插入排序每次插入前的遍历步长为1,而希尔排序是将待排序列分为若干个子序列,对这些子序列分别进行直接插入排序,当每个子序列长度为1时,再进行一次直接插入排序时,结果一定是有序的。常见的划分子序列的方法有:初始步长(两个子序列相应元素相差的距离)为要排的数的一半,之后每执行一次步长折半。
二、代码
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
void insert(int arr[],int n){
int i,j,k,gap;//gap为步长
int temp;
for(gap = n/2;gap > 0;gap/=2){//步长减小
for(i = 0;i < gap;++i){//变量 i 为每次分组的第一个元素下标
for(j = i + gap;j < n;j = j + gap){//对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
temp = arr[j];
k = j - gap;
while(k >= 0 && temp <= arr[k]){
arr[k+gap] = arr[k];
k = k - gap;
}
arr[k + gap] = temp;
}
}
}
}
int main()
{
int arr[MAX] = {13,76,43,9,5,98,100,99,32,14};
int n = MAX;
insert(arr,n);
for(int i = 0;i < n;i++){//遍历数组
printf("%-5d",arr[i]);
}
printf("\n");
return 0;
}