zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序

    希尔排序是插入排序的变体。在插入排序中,我们只将元素向前移动一个位置。当一个元素必须向前移动很远时,就会涉及到许多动作。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("
    
    ");
    }
    
    
    
    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;
    }
    
    
  • 相关阅读:
    jchdl
    jchdl
    jchdl
    jchdl
    jchdl
    jchdl
    jchdl
    UVa 437 (变形的LIS) The Tower of Babylon
    UVa 1025 (动态规划) A Spy in the Metro
    UVa 10129 (并查集 + 欧拉路径) Play on Words
  • 原文地址:https://www.cnblogs.com/wjundong/p/11907716.html
Copyright © 2011-2022 走看看