經典排序演算法總結

2021-08-22 11:39:58 字數 3160 閱讀 7619

插入排序

選擇排序

歸併排序

排序方法

平均情況

最好最差

空間複雜度

穩定性氣泡排序o(

n2) o(n

2)

o(n)o(

n)

o(n2

) o(n

2)

o(1)o(

1)

穩定快速排序o(

nlogn)o(

nlog⁡n

)o(

nlogn)o(

nlog⁡n

)o(

n2) o(n

2)

o(nlogn)o(

nlog⁡n

)不穩定直接插入排序o(

n2) o(n

2)

o(n)o(

n)

o(n2

) o(n

2)

o(1)o(

1)

穩定shell排序o(

nlogn)o(

nlog⁡n

)o(n)o

(n)o(

n2) o(n

2)

o(1)o(

1)

不穩定選擇排序o(

n2) o(n

2)

o(n2

) o(n

2)

o(n2

) o(n

2)

o(1)o(

1)

不穩定heap排序o(

nlogn)o(

nlog⁡n

)o(

nlogn)o(

nlog⁡n

)o(

nlogn)o(

nlog⁡n

)o(1)o

(1

)不穩定歸併排序o(

nlogn)o(

nlog⁡n

)o(

nlogn)o(

nlog⁡n

)o(

nlogn)o(

nlog⁡n

)o(n)o

(n

)穩定交換排序的基本思想都為通過比較兩個數的大小,當滿足某些條件時對它進行交換從而達到排序的目的。

1. 氣泡排序

基本思想:比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出乙個未排序中最大的數放到陣列後面。

void bubblesort(int *arr, int n) }}

}

2. 快速排序

基本思想:選取乙個基準元素,通常為陣列第乙個元素(或者最後乙個元素)。從後向前遍歷陣列,當遇到小於基準元素的元素時,把它和左邊第乙個不小於基準元素的元素進行交換;然後從前往後遍歷陣列,交替執行上述過程,使基準元素確定自己的位置。在利用分治策略從已經分好的兩組中分別進行以上步驟,直到排序完成。每輪迴圈確定乙個元素的最終位置。

void quicksort(int *s, int

left, int

right)

}

分析

最差時間複雜度:每次選取的基準元素都為最大(或最小元素)導致每次只劃分了乙個分割槽,需要進行n-1次劃分才能結束遞迴,故複雜度為o(

n2) o(n

2)

;最優時間複雜度:每次選取的基準元素都是中位數,每次都劃分出兩個分割槽,需要進行

logn

log⁡

n次遞迴,故時間複雜度為o(

nlogn)

o (n

log⁡n)

;平均時間複雜度:o(

nlogn)

o (n

log⁡n)

。穩定性:不穩定的。輔助空間:o(

nlogn)

o (n

log⁡n)

。 當陣列元素基本有序時,快速排序將沒有任何優勢,基本退化為氣泡排序,可在選取基準元素時選取中間值進行優化。

1.直接插入排序

基本思想:不需要進行交換操作,而是用乙個臨時變數儲存當前值。每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。

void insertsort(int *s, int n)

s[j+1]=tmp;

}}

分析

最壞時間複雜度為陣列為逆序時,為o(

n2) o(n

2)

。最優時間複雜度為陣列正序時,為o(

n)o (n

)。平均時間複雜度為o(

n2) o(n

2)

。輔助空間o(

1)o (1

)。穩定性:穩定

2.shell排序

基本思想為在直接插入排序的思想下設定乙個最小增量dk,剛開始dk設定為n/2。進行插入排序,隨後再讓dk=dk/2,再進行插入排序,直到dk為1時完成最後一次插入排序,此時陣列完成排序。

void shellsort(int *s, int n)

}tmp=s[i];

s[i]=s[index];

s[index]=tmp;

}}

分析

最壞時間複雜度為o(

n2) o(n

2)

。最優時間複雜度為o(

n2) o(n

2)

。平均時間複雜度為o(

n2) o(n

2)

。輔助空間o(

1)o (1

)。穩定性:不穩定。

2.heap排序

基本思想:將待排序列構造成完全二叉樹,然後調整為大根堆或者小根堆,將堆頂元素與二叉樹最後乙個子節點交換,構造新的大根堆,重複上述步驟。

void swap(int *x,int *y)

void max_heap(int

array,int i,int heap_size)

}void build_max_heap(int

array,int heap_size)

}void heap_sort(int

array,int heap_size)

}

經典排序演算法總結

排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...

經典排序演算法複習總結

前置定義 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序。stable sort 插入排序 氣泡排序 歸併排序 計數排序 基數排序 桶排序。unstable sort ...

經典排序演算法總結篇

首先回顧下各種排序的主要思路 一 氣泡排序 示例 public static void bublesort int a 氣泡排序主要思路是 通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就 沉 到最後面了。重複n次即可以使陣列有序。氣泡排序改進1 在某次遍歷中如果沒有資料交換,...