排序的複雜度

2021-08-30 22:59:30 字數 2511 閱讀 3040

1.基本概念

1.1 穩定排序(stable sort)和非穩定排序

穩定排序是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,。反之,就是非穩定的排序。比如:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,經過某種排序後為a1,a2,a4,a3,a5,則我們說這種排序是穩定的,因為a2排序前在a4的前面,排序後它還是在a4的前面。假如變成a1,a4,a2,a3,a5就不是穩定的了。

1.2 內排序( internal sorting )和外排序( external sorting)

在排序過程中,所有需要排序的數都在記憶體,並在記憶體中調整它們的儲存順序,稱為內排序;在排序過程中,只有部分數被調入記憶體,並借助記憶體調整數在外存中的存放順序排序方法稱為外排序。

1.3 演算法的時間複雜度和空間複雜度

所謂演算法的時間複雜度,是指執行演算法所需要的計算工作量。 乙個演算法的空間複雜度,一般是指執行這個演算法所需要的記憶體空間。

2.幾種常見演算法

2.1 氣泡排序(bubble sort)

氣泡排序方法是最簡單的排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的「氣泡」,較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個「氣泡」序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。如果發現兩個相鄰元素的順序不對,即「輕」的元素在下面,就交換它們的位置。顯然,處理一遍之後,「最輕」的元素就浮到了最高位置;處理二遍之後,「次輕」的元素就浮到了次高位置。在作第二遍處理時,由於最高位置上的元素已是「最輕」元素,所以不必檢查。一般地,第i遍處理時,不必檢查第i高位置以上的元素,因為經過前面i-1遍的處理,它們已正確地排好序。

氣泡排序是穩定的,演算法時間複雜度是o(n ^2)。

2.2 選擇排序(selection sort)

選擇排序的基本思想是對待排序的記錄序列進行n-1遍的處理,第i遍處理是將l[i..n]中最小者與l[i]交換位置。這樣,經過i遍處理之後,前i個記錄的位置已經是正確的了。

選擇排序是不穩定的,演算法複雜度是o(n ^2 )。

2.3 插入排序 (insertion sort)

插入排序的基本思想是,經過i-1遍處理後,l[1..i-1]己排好序。第i遍處理僅將l[i]插入l[1..i-1]的適當位置,使得l[1..i] 又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較l[i]和l[i-1],如果l[i-1]≤ l[i],則l[1..i]已排好序,第i遍處理就結束了;否則交換l[i]與l[i-1]的位置,繼續比較l[i-1]和l[i-2],直到找到某乙個位置j(1≤j≤i-1),使得l[j] ≤l[j+1]時為止。圖1演示了對4個元素進行插入排序的過程,共需要(a),(b),(c)三次插入。

直接插入排序是穩定的,演算法時間複雜度是o(n ^2) 。

2.4 堆排序

堆排序是一種樹形選擇排序,在排序過程中,將a[n]看成是完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係來選擇最小的元素。

堆排序是不穩定的,演算法時間複雜度o(nlog n)。

2.5 歸併排序

設有兩個有序(公升序)序列儲存在同一陣列中相鄰的位置上,不妨設為a[l..m],a[m+1..h],將它們歸併為乙個有序數列,並儲存在a[l..h]。

其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlog2n)。

2.6 快速排序

快速排序是對氣泡排序的一種本質改進。它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。在氣泡排序中,一次掃瞄只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1。快速排序通過一趟掃瞄,就能確保某個數(以它為基準點吧)的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有乙個元素為止。

快速排序是不穩定的,最理想情況演算法時間複雜度o(nlog2n),最壞o(n ^2)。

2.7 希爾排序

在直接插入排序演算法中,每次插入乙個數,使有序序列只增加1個節點,並且對插入下乙個數沒有提供任何幫助。如果比較相隔較遠距離(稱為 增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。d.l.shell於2023年在以他名字命名的排序演算法中實現了這一思想。演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

希爾排序是不穩定的,其時間複雜度為o(n ^2)。

表一 各種排序比較

排序類別

時間複雜度

空間複雜度穩定1

插入排序

o(n2)1√

2希爾排序

o(n2)1×

3氣泡排序

o(n2)1√

4選擇排序

o(n2)1×

5快速排序

o(nlogn)

o(logn)×6

堆排序o(nlogn)1×

7歸併排序

o(nlogn)

o(n)

排序演算法複雜度

在這篇裡,來記述下排序演算法複雜度,空間 時間 時間複雜度 對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。空間複雜度 是指演算法在計算機內執行時所需儲存空間的度量,它也是資料規模n的函式。穩定 如果a原本在b前面,而a b,排序之後a仍然在b的前面。不穩定 如果a原本在b的前面,而...

排序演算法複雜度

時間複雜度 基數排序的空間複雜度為o n 排序方法 最好情況 最壞情況 平均情況 穩定性 空間複雜度 氣泡排序 o n o n2 o n2 穩定 快速排序 o nlogn o n2 o nlogn 不穩定 簡單選擇排序 o n2 不穩定 堆排序 o nlogn 不穩定 直接插入排序 o n o n2...

排序演算法的 時間複雜度 和 空間複雜度

常用的排序演算法的時間複雜度和空間複雜度 排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 o n2 o n2 穩定 o 1 快速排序 o n2 o n log2n 不穩定 o log2n o n 選擇排序 o n2 o n2 穩定 o 1 二叉樹排序 o n2 o n log2n...