• 當前位置: 摩鑫平台 >> 知識庫 >> 軟件閑敘 >> 正文
    【初階數據結構】詳解插入排序 & 希爾排序(內含排序的概念和意義)
    發布時間:2024-12-02       編輯🚴🏻‍♂️:網絡中心       瀏覽次數:

     版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明➜。

    本文鏈接👂:https://blog.csdn.net/tianxiawushanu/article/details/142660275

    1. 排序的概念及其應用

    在正式講解插入排序和希爾排序之前,我要帶著大家理解我們為什麽需要排序?以及排序在我們生活中有什麽應用?學完這些之後,大家也許對排序算法就不會那麽迷茫了⚓️。

    1.1 排序的概念

    排序🌬🧚🏿‍♂️:所謂排序↗️,就是使一串記錄👩🏼‍⚕️,按照我們特定且可行的想法,遞增或遞減的排列起來的操作🪔。

    排序是一項操作!

    1.2 排序的應用

    看到這裏⏪,大家可以打開京東商城🙂‍↔️,當你想買一臺新的手機時🧑‍🧒‍🧒,卻不知如何入手🤦🏼‍♂️。你可能會選擇按好評數來進行排序🍬,從而選出好評率最高的手機。在這個過程,就用到了排序的思想。

    在這裏插入圖片描述

    再如,我們的大學按照教學資源以及教學能力🧜🏻‍♂️,也能進行排序😟:
    大學排名
    當然,生活中還有很多例子都是用到了排序的思想。這就是所謂處處有排序!

    好了🧑‍🧑‍🧒,在了解完排序的重要性之後,我們就要正式邁入學習插入排序和希兒排序的殿堂中了。
    哈哈哈

    2. 插入排序

    插入排序🥮,通常我們也稱它為直接插入排序。

    2.1 基本思想

    在一個有序的數組中🫴🏿,按照一定的規則插入待排序的數字🥦。

    詳細一點說的話☔️,就是🏺🐤:

    算法思路:
    先從單趟排序講起,我們可以選擇待插入的數字與從排序好的數組末端的數進行比較。若發現該值比待插入的數字要大,則將蓋子往後挪動一位,接著繼續往前面進行比較。若發現該值比待插入的數字要小,說明該值的後面一個位置就是待插入數字應該插入的位置🧑🏽‍🦰,我們就可以結束循環了。

    單趟排序講完了之後📁,就可以將一個完整的插入排序了🤟🏼。
    如果你真的認證解讀了單趟插入排序的思路,你會發現插入排序不過如此🕘!

    其實一個完成的插入排序就是在循環地跑單趟排序,循環地初始條件為從待插入數組的第二個元素小標開始🙅🏽。每當單趟排序跑完之後🏓,我們都得設置循環條件的值(一開始比較數組末端的位置)。因為你已經排好了部分數組,每當來一個新數字就得在拍好數組中插入,重復上述過程。

    下面我給大家展示插入排序算法的動圖,希望大家能夠結合上述的話語👨🏽‍🏭,仔細觀看:

    插入排序

    2.2 插入排序的代碼實現

    void InsertSort(int* a, int n){
    for (int i = 1; i < n; i++)
    {
    int end = i - 1; //待排序數組的末端
    //也可以寫成int tmp = a[end + 1];
    int tmp = a[i];  //tmp存放的是待插入的數值
    while (end >= 0)
    {
    if (tmp < a[end]) //待插入數字與數組末端的值進行比較
    {
    a[end + 1] = a[end];
    end--;
    }
    else
    {
    break;
    }
    }

    a[end + 1] = tmp;
    }
    }

    2.3 插入排序算法總結

    根據上面的代碼,我們可以總結出一些關於插入排序算法的特征:

    1. 元素集合越接近有序,直接插入排序算法的時間效率就越高

    2. 時間復雜度:O(N^2)
    3. 空間復雜度:O(1)

      ,它是一種穩定的排序算法

    4. 穩定性:穩定

    3. 希爾排序

    希爾排序又稱縮小增量排序。

    3.1 基本思想

    先選定一個整數(gap),把待排序的數據分成個別組。分組的標準就是所有距離為gap的數據分在同一組🥳,並對每一組內的記錄進行排序。然後🙇🏼‍♀️,縮小gap的值👲🏼,重復上述分組和排序的工作👩🏽‍🎤。當gap = 1時,就相當於直接插入排序了。

    上面這個思想很重要,是理解希爾排序的核心!

    給大家舉個例子👨🏼‍🏫:
    分組情況

    3.2 希爾排序的代碼實現

    void ShellSort(int* a, int n){
    int gap = n;
    while (gap > 1)
    {
    //gap /= 2;
    gap = gap / 3 + 1;
    for (int j = 0; j < gap; j++)
    {
    //就是在對每組(隔gap位置的數字)的數據進行插入排序
    for (int i = j; i < n; i += gap)
    {
    int end = i - 1;
    int tmp = a[i];
    while (end >= 0)
    {
    if (tmp < a[end])
    {
    a[end + 1] = a[end];
    end--;
    }
    else
    {
    break;
    }
    }

    a[end + 1] = tmp;
    }
    }
    }

    3.3 希爾排序的特征總結

    • 希爾排序是對直接插入排序的優化👨‍🚒。
    • 當gap > 1時都是預排序👩‍🎨,目的是讓數組更接近於有序。當gap == 1時👵🏼🧑🏽‍🦲,數組已經接近有序的了,這樣就會很快🙎。這樣整體而言,可以達到優化的效果。我們實現後可以進行性能測試的對比。

    • 希爾排序的時間復雜度不好計算↩️,因為gap的取值方法很多,導致很難去計算🛷。但是我們一般認為希爾排序算法的時間復雜度為O(N*logN),但是如果我們追求嚴謹,那它的時間復雜度為O(N^1.3)。

    關閉本頁

    摩鑫平台教育技術與網絡中心版權所有

    ©GDAFC Education Technology & Network Center, All Rights Reserved.

    摩鑫平台专业提供🤱🏽👇🏿:摩鑫平台摩鑫摩鑫娱乐等服务,提供最新官网平台、地址、注册、登陆、登录、入口、全站、网站、网页、网址、娱乐、手机版、app、下载、欧洲杯、欧冠、nba、世界杯、英超等,界面美观优质完美,安全稳定,服务一流,摩鑫平台欢迎您。 摩鑫平台官網xml地圖