《聊聊資料結構與演算法》之排序演算法 上篇

2022-06-24 22:39:15 字數 2654 閱讀 3215

資料結構與演算法一直作為計算機軟體領域的核心基礎之一,其在軟體程式設計領域始終發揮著不可或缺的作用。鑑於軟體開發以及軟體測試的從業者而言,更是一種提公升自身能力的重要途徑。換句話說,如何讓自己的**寫的妙不可言或者快速閱讀一些開源**,享受源**帶來的喜悅與興奮,我們還是有必要熟悉和掌握資料結構與演算法。個人認為,熟知演算法不僅惠及於編碼工作,也有利於強化邏輯思維能力,是件百利而無一害的學習。因此,閒暇之餘我計畫寫些資料結構與演算法系列博文,幫助自己以及有需要的人總結和掌握這方面的知識。其中,關於排序演算法我寫了上下兩篇文章,本文為上篇,另外一篇請朋友們自行檢視我的博文清單。

外部排序多指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。外部排序最常用的演算法是多路歸併排序,即將原檔案分解成多個能夠一次性裝入記憶體的部分,分別把每一部分調入記憶體完成排序。然後,對已經排序的子檔案進行多路歸併排序。

注:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,第乙個鍵排序的結果可以為第二個鍵排序所用。基數排序就是這樣,先按低位排序,逐次按高位排序,低位排序相同的元素其順序在高位排序中是不會改變的。

插入排序(insertion sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

二分(折半)插入(binary insert sort)排序是一種在直接插入排序演算法上進行小改動的排序演算法。其與直接排序演算法最大的區別在於查詢插入位置時使用的是二分查詢的方式,在速度上有一定提公升。

一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:

注:希爾排序,也稱縮小增量排序演算法,因dl.shell於2023年提出而得名,是插入排序的一種高速的改進版本。演算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

換句話說,在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。

氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端。

①術語要是文藝點的話,可以說是攪拌排序,通俗易懂點的話,就叫「雙向氣泡排序」,冒泡是乙個單向的從小到大或者從大到小的交換排序,而雞尾酒排序是雙向的,先從一端進行從小到大排序,然後從另一端進行從大到小排序。

從圖中可以看到,第一次正向比較,我們找到了最大值9。

第一次反向比較,我們找到了最小值1.

第二次正向比較,我們找到了次大值8.

第二次反向比較,我們找到了次小值2

。。。最後就大功告成了。

當陣列有序的時候,我們還會繼續往下排,直到完成length/2次,這個就跟沒優化之前的氣泡排序一樣,此時我們可以加上乙個標誌位issorted來判斷是否已經沒有交換了,如果沒有(則已經有序),提前退出迴圈。

資料結構與演算法之排序(上)

對於冒泡這個排序演算法,相信大家都不陌生,所以我們更加深入的來看一下這個演算法,討論一下他的時間複雜度,最好情況是當所有元素都按公升序排列好了,這個時候的時間複雜度是o n 多少個元素就比較了多少次。為了不讓排序無腦的進行下去,我們加了乙個flag標記,排好序便會自動退出。最壞的情況下,都是逆序排的...

演算法與資料結構之美 排序 上

氣泡排序 bubble sort 插入排序 insertion sort 選擇排序 selection sort 解答開篇 本篇部落格將會總結一下冒泡 插入 選擇排序,思考乙個問題就是,插入排序和氣泡排序的時間複雜度都是o n 2 但是為何在實際軟體開發中更傾向於選擇插入排序?分析排序演算法的執行效...

資料結構與演算法之美 排序(上)

開篇問題的解答請放到最後再看噢 雖然氣泡排序和插入排序演算法的時間複雜度都是o n2 氣泡排序涉及到元素的交換,插入排序涉及到元素的移動,交換次數和移動次數都是相同的,都是原始序列的逆序度。在氣泡排序中,元素的交換要三次賦值語句,而插入排序中元素的移動只需要一次賦值語句。所以若考慮到效能優化到極致,...