希尔排序就是插入排序的优化
#include<stdio.h>
#include<stdlib.h>
void swap(int* a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
void Printf(int arr[], int size){
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
void InsertSort(int arr[], int size){//选择排序
for (int i = 0; i < size - 1; i++){
for (int j = i; j >= 0; j--){
if (arr[j]>arr[j + 1]){
swap(arr + j, arr + j + 1);
}
}
}
}
void ShellSort(int arr[], int size,int gap){//希尔排序
for (int i = gap; i < size ; i++){
for (int j = i-gap; j >= 0; j-=gap){
if (arr[j]>arr[j + gap]){
swap(arr + j, arr + j + gap);
}
}
}
}
int main(){
int arr[] = { 8, 6, 5, 4, 66, 52, 14, 28, 31, 4, 1 };
int size = sizeof(arr) / sizeof(int);
int gap = size;
/*printf("选择排序前:");
Printf(arr, size);
InsertSort(arr, size);
printf("排序后:");
Printf(arr, size);*/
printf("排序前:");
Printf(arr, size);
while (1){
gap = gap / 3 + 1;
ShellSort(arr, size,gap);
if (gap == 1){
break;
}
}
printf("希尔排序后:");
Printf(arr, size);
system("pause");
return 0;
}
调试结果: