希尔排序
希尔排序像是插入排序的升级版
把数组分组以后再进行插入排序
分组的次数是:increasement=sizeof(arr)/3+1
分组排序以后序列会有一个大致的顺序
最后进行全排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 10
void ShellSort(int arr[], int len) {
int increasement = len;
int k;
//为了让最后一次全排列可以执行到使用do while语句
do
{
//计算出这个数列需要分的组数
increasement = increasement / 3 + 1;
for (int i = 0; i < increasement; ++i) {
//与插入排序完全相同,只是把插入排序的增量1换成increasement
for (int j = i + increasement; j < len; j += increasement) {
int tem = arr[j];
if (arr[j] < arr[j - increasement]) {
for (k = j - increasement; k >= 0&&tem<arr[k]; k -= increasement) {
arr[k + increasement] = arr[k];
}
arr[k + increasement] = tem;
}
}
}
} while (increasement>1);
}
void Print_ShellSort(int arr[], int len) {
for (int i = 0; i < len; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
printf("------------------------------------------\n");
}
int main() {
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; ++i) {
arr[i] = rand() % MAX;
}
Print_ShellSort(arr, MAX);
ShellSort(arr, MAX);
Print_ShellSort(arr, MAX);
system("pause");
return 0;
}