<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          小白學排序 | 十大經(jīng)典排序算法(動圖)

          共 3077字,需瀏覽 7分鐘

           ·

          2020-08-10 16:16


          • 算法分類

            • 冒泡排序(重點)

            • 選擇排序

            • 插入排序

            • 歸并排序(重點)

            • 快速排序(重點)

            • 堆排序(重點)

            • 計數(shù)排序

            • 基數(shù)排序

          本文的重點排序方法在:冒泡排序,歸并排序,快速排序,桶排序


          算法分類

          十種常見排序算法可以分為兩大類:

          比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此也稱為非線性時間比較類排序。非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此也稱為線性時間非比較類排序。

          【算法復雜度】

          【相關概念】

          • 穩(wěn)定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
          • 不穩(wěn)定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現(xiàn)在 b 的后面。
          • 時間復雜度:對排序數(shù)據(jù)的總的操作次數(shù)。反映當n變化時,操作次數(shù)呈現(xiàn)什么規(guī)律。
          • **空間復雜度:**是指算法在計算機內執(zhí)行時所需存儲空間的度量,它也是數(shù)據(jù)規(guī)模n的函數(shù)。

          冒泡排序(重點)

          • Bubble Sort

          【算法描述】

          • 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
          • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對,這樣在最后的元素應該會是最大的數(shù);
          • 針對所有的元素重復以上的步驟,除了最后一個;
          • 重復步驟1~3,直到排序完成。

          【動圖演示】

          選擇排序

          • Selection Sort
          • 表現(xiàn)最穩(wěn)定的排序算法之一,因為無論什么數(shù)據(jù)進去都是O(n2)的時間復雜度,所以用到它的時候,數(shù)據(jù)規(guī)模越小越好。唯一的好處可能就是不占用額外的內存空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。【算法描述】

          選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

          【動圖演示】


          插入排序

          • Insertion Sort

          【算法描述】

          一般來說,插入排序都采用in-place在數(shù)組上實現(xiàn)。具體算法描述如下:

          • 從第一個元素開始,該元素可以認為已經(jīng)被排序;
          • 取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描;
          • 如果該元素(已排序)大于新元素,將該元素移到下一位置;
          • 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
          • 將新元素插入到該位置后;
          • 重復步驟2~5。

          【動圖演示】


          歸并排序(重點)

          • Merge Sort
          • 歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為2-路歸并。
          • 是遞歸的思想
          • 歸并排序是一種穩(wěn)定的排序方法。和選擇排序一樣,歸并排序的性能不受輸入數(shù)據(jù)的影響,但表現(xiàn)比選擇排序好的多,因為始終都是O(nlogn)的時間復雜度。代價是需要額外的內存空間。【算法描述】
          • 把長度為n的輸入序列分成兩個長度為n/2的子序列;
          • 對這兩個子序列分別采用歸并排序;
          • 將兩個排序好的子序列合并成一個最終的排序序列。

          【動圖演示】

          快速排序(重點)

          • Quite Sort
          • 快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。
          • 之前一直以為快排和二分法有關,但是其實是分治法的應用。

          【算法描述】

          快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:

          • 從數(shù)列中挑出一個元素,稱為 “基準”(pivot);
          • 重新排序數(shù)列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作;
          • 遞歸地(recursive)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序。

          【動圖演示】

          堆排序(重點)

          • python中sort排序的方法就是堆排序
          • 堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節(jié)點。

          【算法描述】

          這個比較復雜。先看動圖然后慢慢細說。

          【動圖演示】


          【分步詳解】

          • 堆(二叉堆)可以視為一棵完全的二叉樹。完全二叉樹的一個優(yōu)秀的性質就是,除了最底層之外,每一層都是滿的

          • 二叉堆一般分為兩種:最大堆和最小堆。

          • 最大堆 :最大堆中的最大元素在根結點(堆頂);堆中每個父節(jié)點的元素值都大于等于其子結點(如果子節(jié)點存在)

          • 最小堆:最小堆中的最小元素出現(xiàn)在根結點(堆頂);堆中每個父節(jié)點的元素值都小于等于其子結點(如果子節(jié)點存在)

          假設我們要對目標數(shù)組A {57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}進行堆排序。

          首先第一步和第二步,創(chuàng)建堆,這里我們用最大堆;創(chuàng)建過程中,保證調整堆的特性。從最后一個分支的節(jié)點開始進行調整為最大堆。

          現(xiàn)在得到的最大堆的存儲結構如下:

          接著,最后一步,堆排序,進行(n-1)次循環(huán)。

          這個迭代持續(xù)直至最后一個元素即完成堆排序步驟。

          【個人理解】

          通過堆這個結構,讓隨機兩個數(shù)組進行比大小,然后讓獲勝者之間再比大小,這樣就可以通過復雜都logn得到一個最大的數(shù)字。然后不考慮這個數(shù)字,在剩下的數(shù)字中重復這個過程。有點類似比賽半決賽,四分之一決賽,八強這樣的感覺。

          計數(shù)排序

          • Counting Sort
          • 計數(shù)排序不是基于比較的排序算法,其核心在于將輸入的數(shù)據(jù)值轉化為鍵存儲在額外開辟的數(shù)組空間中。作為一種線性時間復雜度的排序,計數(shù)排序要求輸入的數(shù)據(jù)必須是有確定范圍的整數(shù)。敲黑板!計數(shù)排序不是基于比較的,所以是線性時間復雜度,但是速度快的代價就是對輸入數(shù)據(jù)有限制要求:確定范圍的整數(shù)

          【算法描述】

          這部分不怎么用看,直接看動圖就理解了

          • 找出待排序的數(shù)組中最大和最小的元素;
          • 統(tǒng)計數(shù)組中每個值為i的元素出現(xiàn)的次數(shù),存入數(shù)組C的第i項;
          • 對所有的計數(shù)累加(從C中的第一個元素開始,每一項和前一項相加);
          • 反向填充目標數(shù)組:將每個元素i放在新數(shù)組的第C(i)項,每放一個元素就將C(i)減去1。

          【動圖演示】

          基數(shù)排序

          • Radix Sort
          • 基數(shù)排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類推,直到最高位。**有時候有些屬性是有優(yōu)先級順序的,先按低優(yōu)先級排序,再按高優(yōu)先級排序。**最后的次序就是高優(yōu)先級高的在前,高優(yōu)先級相同的低優(yōu)先級高的在前。

          【算法描述】

          • 取得數(shù)組中的最大數(shù),并取得位數(shù);
          • arr為原始數(shù)組,從最低位開始取每個位組成radix數(shù)組;
          • 對radix進行計數(shù)排序(利用計數(shù)排序適用于小范圍數(shù)的特點);

          【動圖演示】




          相關閱讀:


          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品福利一区二区三区 | 欧美巨大性爱视频 | 黄色国产在线观看 | 香蕉天堂网 | 日日夜夜操操 |