排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化
- 今天講解一下快速排序算法的原理以及實現、復雜度和穩定性分析與優化
目錄
- 1 快速排序的原理
- 2 快速排序代碼實現
- 3 復雜度和穩定性分析、優化
- 4 習題練習
1 快速排序的原理
快速排序是所有內部排序算法中平均性能最優的排序算法
快速排序是對冒泡排序算法的一種改進
快速排序由C. A. R. Hoare在1960年提出。
它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
快速排序的基本思想是基于分治法的
在待排序表L[1…n]中任取一個元素pivot作為樞軸(或基準,通常取首元素)
也就是常見的 固定位置選取基準
通過一趟排序將待排序表劃分為獨立的兩部分L[1…k-1]和L[k+1…n]
使得L[1…k-1]中的所有元素小于pivot
L[k+1.n]中的所有元素大于等于pivot
則pivot放在了其最終位置L(k)上
這個過程稱為一趟快速排序(或一次劃分)
然后分別遞歸地對兩個子表重復上述過程,直至每部分內只有一個元素或空為止,即所有元素放在了其最終位置上。
一趟快速排序的過程是一個交替搜索和交換的過程
常見方法就是 挖坑法
不過需要注意:
如果選擇 第一個數組元素為基準時,必須先 從后向前進行
如果選擇 最后一個數組元素為基準時,必須先 從前向后進行
挖坑法的流程:
2 快速排序代碼實現
首先寫好劃分操作算法,然后遞歸調用~
// 每一次的 劃分操作 int Partition(int *arr, int left, int right) {int i = left;int j = right;// 固定位置選取基準 選第一個 int k = arr[left]; while (i < j){while(i < j && arr[j] >= k) {j--;}arr[i] = arr[j];while(i < j && arr[i] <= k) {i++;}arr[j] = arr[i];}arr[i] = k;return i; }// 遞歸調用 實現快速排序 void QuickSort(int *arr,int low,int high) {int k = Partition(arr,low,high);if(low < k-1){QuickSort(arr,low,k-1);}if(high > k+1){QuickSort(arr,k+1,high);} }示例:
int arr[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};3 復雜度和穩定性分析、優化
① 空間復雜度
由于快速排序是遞歸的,需要借助一個遞歸工作棧來保存每層遞歸調用的必要信息,其容量應與遞歸調用的最大深度一致。
最好情況下為 O(log2n)
最壞情況下 O(n) ;因為要進行n-1 次遞歸調用
平均情況下,棧的深度為 O(log2n)
② 時間復雜度
快速排序的運行時間與劃分是否對稱有關
最壞情況發生在初始排序表基本有序或基本逆序時,時間復雜度為 O(n)
最好的情況,每一次劃分都很均衡,時間復雜度為 O(nlog2n)
③ 優化:提高算法效率
一種方法是盡量選取一個可以將數據中分的樞軸元素
三分取中法選取基準:從序列的頭尾及中間選取三個元素,再取這三個元素的中間值作為最終的樞軸元素;
隨機選擇基準:隨機地從當前表中選取樞軸元素
這樣做可使得最壞情況在實際排序中幾乎不會發生。
④ 穩定性
一種情況是,右端區間有兩個關鍵字相同,且均小于基準值,則交換到左端區間后,它們的相對位置(不是絕對位置)會發生變化
所以快速排序是一種不穩定的排序方法
4 習題練習
總結
以上是生活随笔為你收集整理的排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12个python超强学习网站!加pyt
- 下一篇: 排序算法 | 简单选择排序,算法的图解、