常見排序演算法以及對應的時間複雜度和空間複雜度

2022-08-28 12:57:14 字數 4266 閱讀 7963

排序:將雜亂無章的資料,按照一定的方法進行排列的過程叫做排序。

排序大的分類可分為內排序外排序,不需要訪問外存就能進行排序的叫做內排序。

插入排序:直接插入排序、二分法插入排序、希爾排序。

選擇排序:直接選擇排序、堆排序。

交換排序:氣泡排序、快速排序。

歸併排序

基數排序

排序也可以分為穩定排序不穩定排序

穩定排序:假設在待排序的檔案中,存在兩個或兩個以上的記錄具有相同的關鍵字,在用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。即;若a[i]=a[j],a[i]a[j]之前,經過排序後a[i]依然在a[j]之前。氣泡排序、直接插入排序、二分插入排序、歸併排序,基數排序都是穩定排序。

不穩定排序:直接選擇排序、堆排序、快速排序、希爾排序,猴子排序。

以公升序為例,比較相鄰的元素,如果第乙個比第二個大,則交換他們兩個。如果兩個元素一樣大,則繼續比較下一對。所以氣泡排序是一種穩定排序。

選擇乙個基準元素,通常選擇第乙個元素或者最後乙個元素,通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。快速排序是不穩定排序。

將序列分為兩個部分,},每次處理就是將無序數列的第乙個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。如果碰到相等的元素,就會把它插入到想等元素後面,順序不會改變,所以直接插入排序是穩定排序。

在直接插入排序的基礎上,對有序序列進行劃分。例如:序列為,a[i]}其中為有序序列,取a[(i-1)/2],將其與a[i]比較,即可確定a[i]的範圍(a[0]...a[(i-1)/2]或者a[(i-1)/2]...a[i-1]),然後繼續在已確定的範圍內進行二分。範圍依次縮小為:1/2、1/4、1/8、1/16......可快速確定a[i]應該插入的位置。二分插入排序也是穩定排序。

將整個序列分割成若干個小的子串行,每個子串行內分別進行插入排序。一般情況下步長取n/2。直到最後一次步長為1,即所有元素在乙個組中進行排序。由於希爾排序是先將整個序列劃分為多個子串行進行排序,相同的元素順序在這個過程中順序可能會被打亂,所以希爾排序是不穩定排序。

從待排序的資料元素中,選出最小或最大的元素與序列第乙個數交換。直到所有資料排完。直接選擇排序是不穩定排序。例如:,第一次排序就將1和第乙個3交換,想等元素的順序改變了。

以n=10的乙個陣列49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例

第一次 gap = 10 / 2 = 5

49 38 65 97 26 13 27 49 55 4

分成了五組(49, 13) (38, 27) (65, 49) (97, 55) (26, 4)

這樣每組排序後就變成了(13, 49) (27, 38) (49, 65) (55, 97) (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序後13 27 49 55 4 49 38 65 97 26

第三次 gap = 2 / 2 = 1

4 26 13 27 38 49 49 55 97 65

第四次 gap = 1 / 2 = 0 排序完成得到陣列:

4 13 26 27 38 49 49 55 65 97

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

最大堆:每個節點的值都大於等於它的孩子節點。

最小堆:每個節點的值都小於等於它的孩子節點。

最大堆第0個資料是最大數,最小堆第0個資料是最小數。

堆排序是不穩定排序

思想

建堆交換第0個資料和最後乙個資料,彈出最大或者最小資料。

重複1. 2. 直到最後兩個節點交換完成。

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

如何將兩個有序序列合併?(公升序)

,

b[0]思想

將陣列分成二組a,b如果這二組組內的資料都是有序的,那麼就可以按照上述方法對這二組資料進行排序。如果這二組資料是無序的?

可以將a,b組各自再分成二組。遞迴操作,直到每個小組只有乙個資料,每個小組只有乙個元素所以我們可以認為它已經是有序序列,然後進行合併。

先分解後合併。

歸併排序是穩定排序

將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。從最低位起從0-9依次掃瞄序列,一邊掃瞄一邊將掃瞄到的資料加到新的序列中,得到乙個序列。然後比較高一位,重複上述操作,直到最高位排序完成。數列就變成乙個有序序列。基數排序是穩定排序。

以全是二位數的序列舉例

初始序列:

73,22,93,43,55,14,28,65,39,81

首先根據個位數的數值,將他們放到對應的數值下面

01 81

2 22

3 73 93 43

4 14

5 55 6567

8 28

9 39

排序好的序列為:

81,22,73,93,43,14,55,65,28,39

再根據十位數數值對上面拼接好的序列進行排序

01 14

2 22 28

3 39

4 43

5 55

6 65

7 73

8 81

9 93

最終的有序序列:

14,22,28,39,43,55,65,73,81,93

無限猴子定理:指乙隻猴子隨機在打字機鍵盤上按鍵,最後必然可以打出法國國家圖書館的每本圖書。

隨機打亂陣列,檢查是否有序。

有序則輸出,無序則重複上述步驟。

時間複雜度最低1次,最高可執行到世界的盡頭。。。

排序方法

時間複雜度(平均)

時間複雜度(最壞)

時間複雜度(最好)

空間複雜度

穩定性複雜性

直接插入排序

o(n2)

o(n2)

o(n)

o(1)

穩定簡單

希爾排序

o(nlog2n)

o(n2)

o(n)

o(1)

不穩定較複雜

直接選擇排序

o(n2)

o(n2)

o(n2)

o(1)

不穩定簡單

堆排序o(nlog2n)

o(nlog2n)

o(nlog2n)

o(1)

不穩定較複雜

氣泡排序

o(n2)

o(n2)

o(n)

o(1)

穩定簡單

快速排序

o(nlog2n)

o(n2)

o(nlog2n)

o(nlog2n)

不穩定較複雜

歸併排序

o(nlog2n)

o(nlog2n)

o(nlog2n)

o(n)

穩定較複雜

基數排序

o(d(n+r))

o(d(n+r))

o(d(n+r))

o(n+r)

穩定較複雜

Ajax的常見錯誤以及對應處理

1.網路暢通,伺服器端能接收到請求,伺服器端返回的結果不是預期結果。對應處理 判斷http狀態碼,對其進行處理 xhr.onload function 2.網路暢通,伺服器端沒有接收到請求,返回404狀態碼。對應處理 檢查請求的處理是否發生錯誤 即檢視對應資源是否存在 3.網路暢通,伺服器端能接收到...

常見排序演算法的時間複雜度

最好最壞 平均陣列中插入元素 o 1 每次都在陣列的末尾插入 o n 每次都在陣列的頭部插入 假設資料量為n。最好 最壞平均 基本排序 冒泡 無標誌位 o n 2 o n 2 o n 2 冒泡 有標誌位 o 1 說明 已有序,只需1次 o n 2 說明 逆序,標誌位無效。同上 o n 2 說明 以有...

常見的損失函式以及對應的應用場景

損失函式 loss function 也可稱為代價函式 cost function,用於衡量 值與實際值的偏離程度。我們機器學習的目標就是希望 值與實際值偏離較小,也就是希望損失函式較小,也就是所謂的最小化損失函式。幾種常見的損失函式如下 1.0 1損失 可用於分類問題,該函式使用者衡量誤分類的數量...