演算法基礎 排序基礎 分割槽演算法之單向迴圈法

2021-10-25 07:59:51 字數 1924 閱讀 5614

前一篇文章中介紹了快排的核心分割槽演算法的雙向迴圈法的實現,分割槽演算法將待排序列根據基準值進行分割槽,形成整體有序區域性無序的結果特徵,加之每次執行都會使序列中的基準值就位,非常簡潔和有效。雙向迴圈雖然理解簡單,但是實現稍微繁瑣(雖然之後十來行,但是畢竟是經典演算法,還是可以利用別的方式進一步的簡化),這篇文章繼續介紹一下另外一種方式:單向迴圈法。

雙向迴圈:理解起來非常簡單,就是大迴圈中分別套兩個迴圈(分別用於控制左右指標),根據左右指標進行交換,左右指標重疊的地方就是基準值的就坐位置。

雙向迴圈法詳細參看如下內容:

單向迴圈:雙向迴圈可能會是一般直接能想到的方式,排除這種先入為主的方式,問題重新梳理,無非就是分成兩塊,正常一遍遍歷下來順便就完成小於基準值的都移到左邊呢。按照著這個思路,更簡單的單向迴圈就呼之欲出了。只用乙個指標用來記錄小於或等於基準值的元素位置,準確來說是範圍,從0~此位置的所有元素都滿足小於或等於基準值,只有乙個正常的迴圈,迴圈中如果碰到比初始值小的就進行交換,每次交換之後此指標前行乙個位置,此指標的位置確保為小於或等於基準值。迴圈結束之後在進行基準值和此位置的交換即可,整體只有乙個迴圈加上乙個條件判斷和兩處交換,簡潔美麗。

分割槽演算法可以使用單向迴圈方式,主要的演算法要點如下所示,

迴圈:只有一處迴圈,初始值從基準值後乙個元素開始,結束為序列最後乙個元素

指標:只有乙個真正意義上的指標,指標初始值指向基準值,迴圈遍歷中碰到大於基準值的情況直接無視,只有小於基準值的情況下才會進行指標的移動和內容的交換,注意先移動後交換,因為此指標只有發生移位的時候才會遞增,是這個演算法的關鍵。

元素交換:在迴圈內遞增和交換需要一同處理,因為迴圈會跳過大於基準值的情況,所以迴圈的下標比此指標可能走的要快,這種情況下,此指標移動的位置處必然是大於基準值的元素,而外層遍歷中進來的條件是小於的情況,所以就可以進行交換了。

基準值定位:最終的指標指定的位置即為小於或等於基準值的最後乙個元素的位置,直接和初始的基準值進行交換即可。

int

partition

(int

* arr,

int start,

int end)

} arr[start]

=arr[index]

; arr[index]

=pivot;

return index;

}

加上列印和呼叫的示例**,可以使用如下方式進行驗證

#include

#include

#include

intpartition

(int

* arr,

int start,

int end)

} arr[start]

=arr[index]

; arr[index]

=pivot;

return index;

}void

print_array

(int

* arr,

int num)

intmain()

partition

(array,

0,n-1)

;print_array

(array,n)

;free

(array)

; array=

null;}

}

執行結果示例

9

4 6 4 5 2 6 4 4 9

4 4 2 4 4 6 5 6 9

基礎演算法之快速排序演算法

快速排序基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。比如序列 6,8,1,4,3,9 選取6為基準數key 不會變的 然後從右往左遍...

基礎演算法之選擇排序演算法

在要排序的一組數中,選出最小 或者最大 的乙個數與第1個位置的數交換 然後在剩下的數當中再找最小 或者最大 的與第2個位置的數交換,依次類推,直到第n 1個元素 倒數第二個數 和第n個元素 最後乙個數 比較為止。def select sort array for i in range len arr...

基礎演算法之氣泡排序演算法

在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。以隨機產生的五個數為例 li 354,405,469,82,345 氣泡排序是怎麼實現的?首先先來個大...