排序演算法概要

2021-08-14 09:53:00 字數 2569 閱讀 7004

希爾排序

歸併排序

快速排序

堆排序

每次選擇乙個最小(最大)的元素,放到陣列的最前面。

過程:在要排序的一組數中,首先遍歷一遍,找到最小的數,和放在第乙個位置的數交換。然後從第二個數開始遍歷,找到最小的數,和放在第二個位置的數交換。就這樣一直迴圈,直到最後只剩下乙個數。

由以上過程可以知道,選擇排序演算法總是按照固定的流程來執行,不會因為輸入數字的特點的不同,而導致演算法的執行步驟不同,因此選擇排序演算法有乙個重要特點:執行時間和輸入資料的特點無關

對於有n個元素的陣列,選擇排序演算法需要比較 n(

n−1)

2 次,需要交換 n−

1 次,每次交換只需要乙個單位的額外空間,因此該演算法為原地工作。時間複雜度為 o(

n2) 。

排序演算法不是穩定的,例如要排序[5 9 5 2],前面的元素5就會被交換到最後乙個位置。

每次獲取乙個元素,把它插入到已排序的子陣列中的適當位置。

直接插入排序

首先可以認為第乙個元素是乙個有序的子陣列,然後選中第二個元素,把它插入到之前的子陣列(該陣列中只有乙個元素)中,使其有序。這樣前二個元素組成的子陣列是有序的,以此類推,選擇第三個,第四個元素。。。最後乙個元素,插入到合適的位置,就可以使整個陣列有序。

為確定插入位置,可以對已排序的陣列逐個元素進行比較來確定位置,然後插入選中的元素。使用這種方法:

- 最好情況下需要比較 n−

1 次,元素交換

0 次(此情況下陣列正好是有序的)。

- 最差情況下需要比較 n(

n−1)

2次,需要交換 n(

n−1)

2 次元素。(這是對於陣列而言。對於鍊錶,每個元素插入到合適的位置只需要移動一次)

因此插入排序演算法執行時間和輸入有關。陣列有序程度越高,執行時間越快。最差時間複雜度 o(

n2) ,最優時間複雜度 o(

n)。

直接插入排序需要乙個額外空間用來交換元素,為原地工作的。直接插入排序是穩定的。

二分插入排序

二分插入排序和直接插入排序的不同就是確定插入位置的方法不同,直接插入排序是將待插入元素和陣列進行逐個比較,而二分插入排序利用了要插入的陣列是有序的這一特點,使用二分查詢來確定插入位置。

因此二分查詢的比較次數為 nl

ogn 次。

將各個h子陣列(陣列中間隔為h的元素組成的陣列)進行插入排序。縮小h的值,不斷迭代這一過程,直到h為1。

開始的時候h比較大,元素為跳躍式的移動(因此希爾排序是不穩定的)。後來隨著h的縮小,陣列有序程度越來越高,最後使用插入排序(此時h=1)。而插入排序中每次元素只移動乙個位置。

希爾排序是對插入排序的改良,先通過某些方法讓陣列基本有序,然後進行輸入排序,減少了插入排序移動和比較元素的次數。因此希爾排序也叫做分組插入排序

分組長度h一般選取 hn

=3hn

−1+1

,即[1,4,13,40…]這樣的數列

需要1個額外空間用來交換元素,空間複雜度為 o(

1)。時間複雜度大約為o(

n1.5

) 。使用不同的h序列,時間複雜度就不同。

將兩個有序的子陣列歸併(合併)起來,形成乙個更大的有序陣列

自頂向下歸併

將陣列的左右半邊分別進行排序,然後把他們歸併(合併)起來。而陣列左右半邊的排序又要用到歸併排序。 這是乙個遞迴的演算法。

歸併演算法的空間複雜度為 o(

n),用來儲存歸併後的陣列。

最好情況下比較大約 12

nlog

n 次,移動 nl

ogn 次;最差情況下比較 nl

ogn 次,移動 nl

ogn 次。因此時間複雜度為 o(

nlog

n)。

演算法的優化:

1. 由於每次遞迴需要儲存現場,恢復現場等。所以當子陣列元素較少的時候,改用其他非遞迴的演算法(比如插入排序等)比較省時間。

2. 當子陣列有序的時候,就不必再對其進行排序。因此可以先判斷一下是否有序,然後在進行排序。

3. 每一趟歸併,需要把子陣列的元素先複製到乙個臨時陣列,把臨時陣列歸併到原陣列中。假設這兩個陣列為a和b,我們可以先把a中的元素歸併到b中,在下一趟的時候把b中的元素歸併到a中,交替著來。這樣就不用每次都要先複製一遍陣列了,減少了**執行時間。

自底向上歸併

自底向上的歸併演算法和普通的自頂向下的歸併不同

最後說一句,歸併排序是穩定的。

將小於某個元素的所有元素放在其左邊,其他的放在右邊,然後對左右兩個子陣列進行此過程,直到左右兩個陣列均有序。

和歸併演算法是互補的:歸併是先遞迴再歸併,快排是先元素分類再遞迴。

執行時間和輸入有關?無關?

需要1個額外空間?

3-way partition sort(當重複元素比較多的時候)

當子陣列長度較短的時候,可以改用其他非遞迴演算法

每趟訪問n次,交換n/2次。最好logn趟,最壞n趟。

kNN演算法概要

一 演算法概述 1 knn演算法又稱為k近鄰分類 k nearest neighbor classification 演算法。最簡單平凡的分類器也許是那種死記硬背式的分類器,記住所有的訓練資料,對於新的資料則直接和訓練資料匹配,如果存在相同屬性的訓練資料,則直接用它的分類來作為新資料的分類。這種方式...

KMP演算法概要

前言 經典空間換時間演算法 看了賊久才看懂 網上的部落格文章有很多 但是基本都很複雜 從頭到尾說一遍我是真的沒那精力和耐心 因此這篇只說一下最核心的幾個問題 寫的更多是我的思考的過程 希望能對大家有幫助 請結合jlu資料結構課本食用 kmp這三個老傢伙乙個比乙個頂 我們知道最簡單的字串匹配方法是暴力...

幾種演算法思想概要

是一種在數學 管理科學 電腦科學 經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部...