希尔排序

希尔排序

希尔排序是插入排序的变体。在插入排序中,我们只将元素向前移动一个位置。当一个元素必须向前移动很远时,就会涉及到许多动作。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;
}

posted @ 2019-11-21 19:25  wjundong  阅读(189)  评论(0编辑  收藏  举报