常見排序演算法

2022-07-23 02:54:12 字數 2360 閱讀 1965

1. 排序演算法很多,常見的有冒泡/插入/選擇 o(n^2)、歸併/快速 o(nlogn)、桶排序/計數/基數o(n)。

2. 排序過程中,我們需要考慮演算法

a. 原地演算法,即不需要額外的空間

b. 是否是穩定的演算法, 保持原有的順序不變。比如按照乙個物件的多個屬性排序,穩定排序演算法更好實現,效率更好。

c.最好、最壞、平均時間複雜度,有的特定資料情況下,某些演算法時間複雜度會退化。

我們知道,時間複雜度反映的是資料規模 n 很大的時候的乙個增長趨勢,所以它表示的時候會忽略係數、常數、低階。

但是實際的軟體開發中,我們排序的可能是 10 個、100 個、1000 個這樣規模很小的資料,所以,在對同一階時間複雜度的排序演算法效能對比的時候,我們就要把係數、常數、低階也考慮進來。

3. bubblesort排序優化,設定乙個flag去判斷是否還有交換操作,提前退出比較,提高效率。

//

氣泡排序,a表示陣列,n表示陣列大小

public

void bubblesort(int a, int

n) }

if (!flag) break; //

沒有資料交換,提前退出

}}

4. 歸併排序,核心是把乙個陣列從中間分成2個陣列分別排序,然後在合併兩個有序數組成乙個陣列,結果就是有序的了。本質是分治的思想,採用遞迴這種變成技巧來實現,注意歸併排序不是原地排序演算法,100m的資料,還需要100m的額外空間,所以實際使用比較少,雖然他們最好、最壞、平均時間複雜度都是o(nlogn)。

5. 快排是一致出鏡率很高的排序演算法,他的平時時間複雜度是o(nlogn),他也是分治遞迴的思想。

如果要排序陣列中下標從 p 到 r 之間的一組資料,我們選擇 p 到 r 之間的任意乙個資料作為 pivot(分割槽點)。我們遍歷 p 到 r 之間的資料,將小於 pivot 的放到左邊,將大於 pivot 的放到右邊,將 pivot 放到中間。

它的難點在於中間數pivot的選擇,希望盡可能的分割出兩個元素差不多的區間,演算法的時間複雜度才不會退化,有時候我們可以從一批資料中隨機選乙個,比如最後乙個。有時候為了更好,可以從從資料的前,中,後,分別取1個數出來,選位於中間那個數。

6. 歸併排序和快速排序是兩種稍微複雜的排序演算法,它們用的都是分治的思想,**都通過遞迴來實現,過程非常相似。理解歸併排序的重點是理解遞推公式和 merge() 合併函式。同理,理解快排的重點也是理解遞推公式,還有 partition() 分割槽函式。歸併排序演算法是一種在任何情況下時間複雜度都比較穩定的排序演算法,這也使它存在致命的缺點,即歸併排序不是原地排序演算法,空間複雜度比較高,是 o(n)。正因為此,它也沒有快排應用廣泛。快速排序演算法雖然最壞情況下的時間複雜度是 o(n*n),但是平均情況下時間複雜度都是 o(nlogn)。不僅如此,快速排序演算法時間複雜度退化到 o(n*n) 的概率非常小,我們可以通過合理地選擇 pivot 來避免這種情況。

7. 工程級別的排序演算法,如某種語言的庫方法,往往是由多種演算法組合使用,根據資料規模而動態變化。比如資料量少時,就可以採用歸併排序,即使消耗點記憶體沒什麼關係,而對於大資料量或者記憶體緊張的場合,就採用如快排等原地排序演算法。並且一定注意的是,o(n^2)不一定比o(nlogn)慢,因為我們可能討論的演算法時間複雜度只是一種局勢,實際中我們可能忽略了低階、常量等因子。

應用陣列中的第k大個數。

比如,4, 2, 5, 12, 3 這樣一組資料,第 3 大元素就是 4。我們選擇陣列區間 a[0…n-1]的最後乙個元素 a[n-1]作為 pivot,對陣列 a[0…n-1]原地分割槽,這樣陣列就分成了三部分,a[0…p-1]、a[p]、a[p+1…n-1]。如果 p+1=k,那 a[p]就是要求解的元素;如果 k>p+1, 說明第 k 大元素出現在 a[p+1…n-1]區間,我們再按照上面的思路遞迴地在 a[p+1…n-1]這個區間內查詢。同理,如果 k

常見排序演算法

一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...

常見排序演算法

1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...

常見排序演算法

排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出 對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上 而不是常見演算法書上的偽 希望對正在努力學資料結構與演算法的朋友們有幫助 1 氣泡排序 void bubblesort t a,int n if ...