插入排序
選擇排序
歸併排序
排序方法
平均情況
最好最差
空間複雜度
穩定性氣泡排序o(
n2) o(n
2)
o(n)o(
n)
o(n2
) o(n
2)
o(1)o(
1)
穩定快速排序o(
nlogn)o(
nlogn
)o(
nlogn)o(
nlogn
)o(
n2) o(n
2)
o(nlogn)o(
nlogn
)不穩定直接插入排序o(
n2) o(n
2)
o(n)o(
n)
o(n2
) o(n
2)
o(1)o(
1)
穩定shell排序o(
nlogn)o(
nlogn
)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(
nlogn
)o(
nlogn)o(
nlogn
)o(
nlogn)o(
nlogn
)o(1)o
(1
)不穩定歸併排序o(
nlogn)o(
nlogn
)o(
nlogn)o(
nlogn
)o(
nlogn)o(
nlogn
)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
logn)
;平均時間複雜度:o(
nlogn)
o (n
logn)
。穩定性:不穩定的。輔助空間:o(
nlogn)
o (n
logn)
。 當陣列元素基本有序時,快速排序將沒有任何優勢,基本退化為氣泡排序,可在選取基準元素時選取中間值進行優化。
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 在某次遍歷中如果沒有資料交換,...