在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文看懂直接插入排序和希爾排序

學益得智能硬件 ? 來源:學益得智能硬件 ? 2023-03-06 11:35 ? 次閱讀

要說排序算法里面比較簡單的,我覺得直接插入排序算是一個。

直接插入排序的原理很簡單,就是把一個數字插入到一個有序的數組中。

比如有這么一個數組:

1,3,5,7
然后要把 4 插進去。

過程不難,4跟 7 比,7大,把 7 往后移動;

4跟 5 比,5大,把 5 往后移動;

4跟 3 比,3小,于是直接把4放到第三個位置上。

但是問題又來了,去哪找一個有序的數組,排序本來就是沒有順序的。

于是就有了一個理論,如果一個數組中只有一個元素,那么它一定是有序的。

比如有這么一個數組:
6 4 5 3 7
先把 6 當作一個單獨的數組,那么它一定是有序的。

把 4 插入到這個有序的數組中,先把 4 記下來,4跟 6 比,6向后移動,然后把 4 放到第一個位置。
4 6 5 3 7
接下來再把 5 插入到4 6這個有序的數組中,過程一樣。
4 5 6 3 7
循環下去,最終一定會得到一個有序的數組。

代碼也不難。
#include 
#include 
#include 


#define SIZE     100000


void insert_sort(int *a, int size)
{
    int i, j, num;
    for (i = 1; i < size; i++)
    {   
        num = a[i];
        for (j = i - 1; j >= 0; j--)
        {   
            if (num < a[j])
            {   
                a[j + 1] = a[j];
            }
            else
            {
                break;
            }
        }
        a[j + 1] = num;
    }
}


int main()
{
    int num, arr[SIZE] = {0}, i;


    //隨機產生數組
    srand(time(NULL));
    for (i = 0; i < SIZE; i++)
    {
        arr[i] = rand() % 100;
    }


    insert_sort(arr, SIZE);


    for (i = 0; i < SIZE; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("
");


    return 0;
}

直接插入排序的效率很低,基本上跟冒泡是一個級別。 問題就出在移動的次數太多。
6 4 5 3 7
比如 3 這個元素,最終應該放在 6 這個位置上,但是這個過程需要跟每個數字比較并且向后移動。

于是有個叫做希爾的人就提出了改進思路,如果能讓 3 跳著來,速度就會提高很多。

后來就有了希爾排序。

第一步,先選取 2 作為步長,就是長度的一半,把原數組分成了兩個數組,一個是6 5 7,一個是4 3,對這兩個數組分別做直接插入排序。
6  5  7
 4  3
你會發現,這一次 3 直接和 4 交換了位置,一下子跳了兩步。

第二步,步長再縮減一半,就是1。

其實就是對整個數組做直接插入排序。

有些同學可能會有疑問,既然最終也是對整個數組做直接插入排序,為什么不一開始就這樣?

隨著步長的逐漸的縮減,數組會變得基本有序,雖然最后一步也是直接插入排序,但是移動的元素會很少。

希爾排序的效率要比直接插入排序高很多。

代碼也只需要做簡單的修改。
#include 
#include 
#include 


#define SIZE     100000


void shell_sort(int *a, int size)
{
    int i, j, num, h;
    for (h = size / 2; h > 0; h /= 2)
    {   
        for (i = h; i < size; i++)
        {   
            num = a[i];
            for (j = i - h; j >= 0; j = j - h)
            {   
                if (num < a[j])
                {
                    a[j + h] = a[j];
                }
                else
                {
                    break;
                }
            }
            a[j + h] = num;
        }
    }
}


int main()
{
    int num, arr[SIZE] = {0}, i;


    //隨機產生數組
    srand(time(NULL));
    for (i = 0; i < SIZE; i++)
    {
        arr[i] = rand() % 100;
    }


    shell_sort(arr, SIZE);


    for (i = 0; i < SIZE; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("
");


    return 0;
}
最后來試下 5 萬個數據排序,兩者的差距肉眼可見。
root@Turbo:test# time ./insert_sort 


real  0m1.740s
user  0m1.724s
sys  0m0.000s
root@Turbo:test# time ./shell_sort 


real  0m0.008s
user  0m0.004s
sys  0m0.004s
root@Turbo:test#




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • printf函數
    +關注

    關注

    0

    文章

    31

    瀏覽量

    5921
  • Printf
    +關注

    關注

    0

    文章

    83

    瀏覽量

    13732

原文標題:2分鐘看懂直接插入排序和希爾排序

文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA排序-冒泡排序介紹

    排序算法是圖像處理中經常使用種算法,常見的排序算法有插入排序希爾排序、選擇
    發表于 07-17 10:12 ?1149次閱讀
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介紹

    手把手教你排序算法怎么寫

    今天以直接插入排序算法,給大家分享一下排序算法的實現思路,主要包含以下部分內容:插入排序介紹插入排序算法實現手把手教你排序算法怎么寫在添加新
    的頭像 發表于 06-04 08:03 ?777次閱讀
    手把手教你<b class='flag-5'>排序</b>算法怎么寫

    十種常用排序法詳解總結和比較選擇

    ,并且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。  若要求排序穩定,則可選用歸并排序。但本章介紹的從單個記錄起進行兩兩歸并的排序
    發表于 10-26 15:11

    C語言教程之直接插入排序

    C語言教程之直接插入排序,很好的C語言資料,快來學習吧。
    發表于 04-22 11:06 ?0次下載

    C語言教程之幾種排序算法

    數據結構的排序算法有很多種。 其中, 快速排序希爾排序、堆排序直接選擇
    發表于 11-16 10:23 ?1780次閱讀

    基于C語言二分查找排序源代碼

    本文檔內容介紹了C語言歸并、選擇、直接插入希爾、冒泡、快速、堆排序與順序、二分查找排序源代碼,分享給大家供大家參考。
    發表于 01-04 11:24 ?1次下載

    常用排序算法分析

    種是比較排序,時間復雜度O(nlogn) ~ O(n^2),主要有:冒泡排序,選擇排序插入排序,歸并
    的頭像 發表于 07-13 16:13 ?2206次閱讀

    幾種c語言程序的排序包括應用程序等資料免費下載

    本文檔的主要內容詳細介紹的是幾種c語言程序的排序包括應用程序好資料免費下載包括了:堆排序,改進冒泡排序,歸并排序,簡單插入排序,簡單選擇
    發表于 09-29 08:00 ?6次下載
    幾種c語言程序的<b class='flag-5'>排序</b>包括應用程序等資料免費下載

    插入排序和冒泡排序哪個更牛逼?

    對于時間復雜度的分析,要把最好時間復雜度、最壞時間復雜度、平均時間復雜度分析出來,分別對應了排序算法的最好排序情況、最壞排序情況以及平均排序效率。
    的頭像 發表于 11-27 16:13 ?8296次閱讀

    揭秘冒泡排序、交換排序插入排序

    01 — 冒泡排序 在實現冒泡排序代碼之前我們先理解下什么是冒泡排序,我們舉個現實生活中的例子來幫助我們理解。 操場排隊我們都知道吧,現
    的頭像 發表于 06-18 09:57 ?1581次閱讀

    淺談希爾排序算法思想以及如何實現

    01 希爾排序算法思想 希爾排序也是插入排序,是簡單插入
    的頭像 發表于 06-30 10:05 ?2071次閱讀

    解析數據結構的常用七大排序算法

    為了讓大家掌握多種排序方法的基本思想,本篇文章帶著大家對數據結構的常用七大算法進行分析:包括直接插入排序希爾排序、冒泡排序、快速
    的頭像 發表于 03-16 08:22 ?1735次閱讀

    希爾排序的基本思想

    希爾排序插入排序種,又稱“縮小增量排序”,希爾排序
    發表于 08-08 10:02 ?1390次閱讀

    光纖直接插入芯片,速度和效率驚人!

    TeraPHY是款光學I/O小芯片,擁有4Tbps的雙向帶寬,卻只有10W的功耗。這項技術的重要性在于,擺脫了傳統的PCB和長電氣走線的限制,通過直接插入芯片,實現了更高效的數據傳輸。
    的頭像 發表于 12-21 14:45 ?1017次閱讀

    用FPGA實現雙調排序的方法(2)

    典型的排序算法包括冒泡排序、選擇排序插入排序、歸并排序、快速排序
    的頭像 發表于 03-21 10:28 ?684次閱讀
    用FPGA實現雙調<b class='flag-5'>排序</b>的方法(2)
    主站蜘蛛池模板: 婷婷综合激情网 | 国产精品免费久久久久影院 | 国产片一级特黄aa的大片 | 黄色自拍偷拍 | 毛片大全免费 | 女生扒开尿口让男生舔 | 美女午夜 | 亚洲综合欧美日本另类激情 | 国模无水印一区二区三区 | 高清色黄毛片一级毛片 | 女同国产 | 婷婷综合在线观看丁香 | 三级在线观看视频网站 | 人与牲动交bbbbxxxx | 黄色大片视频 | 久久香蕉综合精品国产 | 欧美视频三区 | yy8090韩国日本三理论免费 | 欧洲精品不卡1卡2卡三卡 | 国产色噜噜 | 黄色成人在线网站 | 人人草人人爽 | 色综合天天综合给合国产 | 国产亚洲精品久久久极品美女 | 乱好看的的激情伦小说 | 天天看片中文字幕 | 久久久国产乱子伦精品 | 日本tv欧美tv天堂 | 亚洲xx网 | 欧美地区一二三区 | 日本色高清 | 激情性爽三级成人 | 午夜va| 在线国产高清 | 天堂资源在线官网bt | 色中涩| 日韩一级黄 | 在线观看日本一区 | 四虎www成人影院观看 | 黄色h网站| 免费看污视频软件 |