思路:希尔排序是对插入排序的一个改进。插入排序适用于小数据,且尽可能有序的数据;
希尔排序将数据分组,进行排序,再合并进行排序。大大提高了插入排序的效率;
#include <stdio.h>
#include <stdlib.h>
void insertSort(int*arr ,int length)
{
int tempData = 0;
int j;
for (int i = 0; i < length-1; ++i)
{
if (arr[i + 1] > arr[i])
{
tempData = arr[i + 1];
for ( j = i + 1; j > 0 && tempData > arr[j - 1] ; --j)
{
arr[j] = arr[j - 1];
}
arr[j] = tempData;
}
}
}
void shellSort(int* arr, int length)
{
int incresment = length;
do
{
int tempData = 0;
int k;
//确定分组增量
incresment = incresment / 3 + 1;
for (int i = 0; i<incresment; ++i)
{
for (int j = i+incresment; j<length; j+=incresment)
{
if (arr[j] < arr[j - incresment])
{
tempData = arr[j];
for ( k = j-incresment; k>0 && arr[k] > tempData; k-=incresment)
{
arr[k+incresment] = arr[k];
}
arr[k+incresment] = tempData;
}
}
}
} while (incresment > 1);
}
int main()
{
int arr[8] = { 1, 3, 4, 5, 7, 8, 6, 5 };
for (int i = 0; i < 8; ++i)
printf("%d ", arr[i]);
printf("\n");
printf("---------排序后-------\n");
shellSort(arr, 8);
for (int i = 0; i < 8; ++i)
printf("%d ", arr[i]);
printf("\n");
system("pause");
return 0;
}