圖解,C語言希爾排序

嵌入式Linux 3月1日算法

嵌入式Linux

嵌入式Linuxshell

一個有溫度的技術公衆號app

435篇原創內容ide

公衆號學習


希爾排序和插入排序很類似,有點像插入排序的升級版本。
ui


希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序通過改進以後的一個更高效的版本,也稱爲縮小增量排序,同時該算法是衝破O(n2)的第一批算法之一spa


希爾排序也是一種插入排序算法,只不過在插入排序上突破告終界,達到了另外一種頂峯的存在,這種頂峯使得時間複雜度變成「O(nLogn)~O(n^2)」。3d


圖片


假設咱們須要給下面的數據進行排序code


圖片


結合以前的文章,咱們知道兩個數據的插入排序就是比較兩個數據的大小,而後進行排列。
blog


希爾排序是經過分組+插入


首先咱們排序的數量是 8 個,咱們須要把數據分紅 8/2 = 4組。


以下圖


圖片


對上面4組的數據進行插入排序後獲得


圖片


而後再繼續分組 8➗2➗2 = 2 分紅 2組


圖片


這兩組數據再進行插入排序


以下圖


圖片

這樣以後,整個數據的排序差很少完成


咱們在這個基礎上再對整個隊列執行一次插入排序,就會完成了整個隊列的排序,由於以前已經對數據進行過排序,再進行插入排序的時候,效率會明顯獲得提高。





整個過程能夠觀看動態圖片




代碼實現看看


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int shell_sort(int arr[],int n)
{
    register int i, j, tmp;
    int step;

    for(step = n/2; step > 0;step /= 2)/*增量步長*/
    {
        /*step = 4 2 1*/
        for(i = step; i < n; i++)
        {
            tmp = arr[i];
            j = i - step;
            for(;j >= 0 && tmp < arr[j];)
            {
                arr[j + step] = arr[j];
                j -= step;
            }
            arr[j + step] = tmp;

        }
    }
}

#define LENGTH 8

int mainint argc, int *argv[])
{
    int i;
    int arr[LENGTH] = {6,5,3,1,8,7,2,4};

    for(i=0;i<LENGTH;i++)
    printf("%d ",arr[i]);printf("\n");

    shell_sort(arr,LENGTH);

    for(i = 0;i < LENGTH;i++)
    printf("%d ", arr[i]);printf("\n");
}


代碼輸出


6 5 3 1 8 7 2 4 
1 2 3 4 5 6 7 8 


代碼圖片解析


步長等於4的時候,先進行第一次插入排序


圖片

 

步長等於2的時候,先進行第二次插入排序


圖片


步長等於1的時候,先進行第三次插入排序


具體過程能夠查看插入排序的文章


圖片




最後一次進行插入排序以後,就會獲得排序完成後的數列


圖片




圖片




推薦閱讀:專輯|Linux文章彙總專輯|程序人生專輯|C語言個人知識小密圈
關注公衆號,後臺回覆「1024」獲取學習資料網盤連接。
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記於心~

相關文章
相關標籤/搜索