常用排序演算法

2021-05-01 09:31:32 字數 3145 閱讀 2923

筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。

一、為什麼要研究排序問題

許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點:

l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序

l很多演算法將排序作為關鍵子程式

l現在已經有很多排序演算法,它們採用各種技術

l排序時乙個可以證明其非平凡下界的問題,並可以利用排序問題的下界證明其他問題的下界

l在實現排序演算法是很多任務程問題即浮出水面

二、排序問題的形式化定義

輸入:由

n個數組成的乙個序列

1,a2,

……,an>

輸出:對輸入序列的乙個排列(重排)

1』,a2』,

……,an』>,

使得a1』

≤a2』

≤……≤

an』

【說明】在實際中,待排序的數很少是孤立的值,它們通常是成為激勵的資料集的乙個部分,每個記錄有乙個關鍵字

key,

是待排序的值,其他資料位衛星資料,它們通常以

key為中心傳遞。 三、

相關概念

1.排序的穩定性:

在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的;若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。

a.穩定排序:

插入排序

、氣泡排序、雞尾酒排序、計數排序、

合併交換排序

、歸併排序、基數排序、桶排序、鴿巢排序

b.不穩定排序:選擇排序、堆排序、希爾排序、快速排序

2.內部、外部排序:在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內、外存交換,則稱之為內部排序

(簡稱內排序

);反之,若排序過程中要進行資料的內、外存交換,則稱之為外部排序。

3.待排檔案的常用儲存方式:

a.順序表:

對記錄本身進行物理重排(即通過關鍵字之間的比較判定,將記錄移到合適的位置

b.鍊錶:

無須移動記錄,僅需修改指標

c.用順序的方式儲存待排序的記錄,但同時建立乙個輔助表:對輔助表的表目進行物理重排(即只移動輔助表的表目,而不移動記錄本身)。

4.影響排序效果的因素

a.待排序的記錄數目nb.

記錄的大小(規模

)c.關鍵字的結構及其初始狀態

d.對穩定性的要求

e.語言工具的條件

f.儲存結構

g.時間和輔助空間複雜度等

四、排序演算法的分類(內部排序)

1.比較類排序:排序結果中各元素的次序基於輸入元素間的比較

a.比較排序演算法的下界

比較排序可以被抽象為決策樹。一棵決策樹是一棵滿二叉樹,表示某排序演算法作用於給定輸入所做的所有比較,而忽略控制結構和資料移動。

在決策樹中,對每個節點都註明i,

j(1≤

i,j≤

n),對每個葉節點都註明排列

<

π(1),

π(2),

……,

π(n)>

。排序演算法的執行對應於遍歷一條從根到葉節點的路徑。在每個內節點作比較ai≤

aj,其左子樹決定ai≤

aj之後的比較,其右子樹決定ai>

aj之後的比較。當到達乙個葉節點時排序演算法就已經確定了順序。要使排序演算法能正確的工作,其必要條件是

n個元素的

n!種排列都要作為決策樹的乙個葉節點出現。在決策樹中,從根到任意乙個可達葉節點之間最長路徑的長度(決策樹的高度)表示對應的排序演算法中最壞情況下的比較次數。對於一棵高度為

h,具有

l個可達葉節點的決策樹有

n! ≤l≤

2h,則有h≥

lg(n!)=

ω(nlgn) b.

常見的比較類排序

a)選擇類排序:選擇排序、堆排序

b)插入類排序:插入排序、二叉插入、兩路插入、希爾排序

c)交換類排序:氣泡排序、雞尾酒排序、合併交換排序、快速排序

d)歸併排序

2.非比較類排序:

計數排序、

基數排序、

桶排序、

鴿巢排序

五、常用的排序演算法 1.

比較類排序

a.選擇類排序

a)選擇排序(

selection sort

)——原地排序、不穩定排序

【思路】

首先找出

a中最小元素,並將其與

a[0]

中元素交換;接著找出

a中次最小元素,並將其與

a[1]

中元素交換;對a中頭

n-1個元素繼續這一過程

【**】

【時間複雜度分析】選擇排序的比較操作為

n(n − 1) / 2

次,交換操作介於0和

n(n − 1) / 2

次之間,故其時間複雜度為θ

(n2) b)

堆排序(

heap sort

)六、**

【二叉堆】(二叉)堆資料結構是一種陣列物件,可以被視為一棵完全二叉樹。二叉堆有兩種:大頂堆和小頂堆(最大堆和最小堆)。大頂堆中每個節點的值不大於其父節點的值,這樣,堆中最大的元素就存放在根節點中。

【思路】首先將輸入陣列構造成大頂堆;由於陣列中最大元素為

a[0]

,將其與

a[n]

交換使其達到最終正確位置;在堆中除去

a[n]

,並將a[1…n]

保持為大頂堆;重複上述過程,直到堆大小降為2。

【**】由思路知堆排序中應包含構造大頂堆和保持大頂堆子程式。

maxheapify

方法被用來保持大頂堆,其時間複雜度為

o(lgn)

buildmaxheap

方法被用來構造大頂堆,其時間複雜度為

o(n)

堆排序**如下:

【時間複雜度分析】呼叫

buildmaxheap

時間為o(n)

,n-1

次呼叫maxheapify

,每次時間為

o(lgn)

,故堆排序時間複雜度為

o(nlgn)  

常用排序演算法

一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...

常用排序演算法

排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...

常用排序演算法

每次從尚未排好的陣列範圍裡選出乙個最小的放到正確的位置。void selection sort int array,int size swap array,lhs,min 從陣列裡選出乙個基準元素,通過交換位置讓它前面的元素都比它小 後面的元素都比它大,最後分而治之。void quicksort i...