希尔排序
希尔排序
希尔排序是插入排序的变体。在插入排序中,我们只将元素向前移动一个位置。当一个元素必须向前移动很远时,就会涉及到许多动作。shellSort的想法是允许远距离项目的交换。在shellSort中,我们将数组h排序为一个较大的h值。我们不断减少h的值,直到它变为1。如果每h个元素的所有子列表都被排序,则数组称为h排序。
前期gap的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期gap取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *getRandArray(int max, int min, int n)
{
srand(time(NULL));
int *array = (int *)malloc(sizeof(int) * n);
for(int i=0; i<n; i++)
array[i] = rand() % max + min;
return array;
}
void printArray(int *array, int n)
{
for(int i=0; i<n; i++)
printf("%d ", array[i]);
printf("\n\n");
}
void shellSort(int arr[], int n)
{
// 从一个大的差距开始,然后缩小差距
for (int gap = n / 2; gap > 0; gap /= 2) {
// 对此间隙大小进行间隙插入排序
// 第一个间隙元素arr[0...gap-1]已按间隙顺序
// 继续添加一个更多的元素,直到对整个数组进行间隙排序
for (int i = gap; i < n; i++) {
// 将arr[i]添加到已进行间隙排序的元素
// 将arr[i]保存在temp中,让 i 位置留空
int temp = arr[i];
// 将较早的间隙排序元素向上移动,直到找到arr[i]的正确位置
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
arr[j] = arr[j - gap];
// 将temp(原始arr[i])插入到其正确的位置
arr[j] = temp;
}
}
}
int main()
{
int len = 20;
int *arr = getRandArray(len, 1, len);
printArray(arr, len);
// 排序
shell(arr, len);
printArray(arr, len);
free(arr);
return 0;
}