理论基础 —— 排序 —— 快速排序
【概述】
快速排序是一種不穩定的排序方法,其同樣屬于交換排序,是對冒泡排序的一種改進:在冒泡排序中,記錄的比較與移動是在相鄰位置進行的,記錄每次交換只能后移一個位置,因而總的比較次數與移動次數較多;而在快速排序中,記錄的比較與移動是從兩端向中間進行的,關鍵碼較大的記錄一次就能從前面移動到后面,關鍵碼較小的記錄一次就能從后面移動到前面,由于記錄移動的距離較遠,從而減少了總的比較次數與移動次數。
【實現過程】
快速排序利用了分治策略,其基本思想是:首先選一個軸值,作為比較的基準,將待排序記錄劃分為獨立的兩部分,左側記錄均小于等于軸值,右側記錄均大于等于軸值,然后分別對這兩部分重復上述過程,直至序列有序。
顯然,快速排序是一個遞歸的過程,其具體的實現為:
?
【時空復雜度分析】
快速排序是一種不穩定的排序方法,其最差時間復雜度為 O(n^2),最優時間復雜度為O(nlogn),平均時間復雜度為 O(nlogn)
由于其是遞歸的,需要一個棧來存放每一層遞歸調用的必要信息,最大容量應與遞歸調用的深度一致,最優空間復雜度為 O(logn),最差空間復雜度為 O(n),平均空間復雜度為 O(logn)
【源程序】
1.一次劃分算法與遞歸實現
設帶劃分的區間是 a[left]~a[right],具體的一次劃分算法如下:
int partitoin(int a[],int left,int right){int pivotKey=a[left];//軸值int i=left,j=right;while(i<j){while(i<j&&a[j]>=pivotKey)//右側掃描j--;swap(a[i],a[j]);//比軸值小的交換到低端while(i<j&&a[i]<=pivotKey)//左側掃描i++;swap(a[i],a[j]);//比軸值大的交換到高端}return i;//返回軸值所在位置 }對待排序序列進行一次劃分后,再分別對左右兩個子序列進行快速排序,直到每個分區都只有一個記錄為止
初始調用 quickSort(a,0,n-1) 即可
void quickSort(int a[],int left,int right){if(left<right){int pivotKey=partitoin(a,left,right);//算出軸值并根據軸值進行分區quickSort(a,left,pivotKey-1);//低子表遞歸quickSort(a,pivotKey+1,right);//高子表遞歸} }?2.綜合實現版
將一次劃分與遞歸實現相結合,初始調用
void quickSort(int a[],int left,int right){if(left>=right)return;int pivotKey=a[left];//軸值int i=left,j=right;while(i<j){while(i<j&&a[j]>=pivotKey)//從右向左掃描,找第一個碼值小于key的記錄,并交換到keyj--;a[i]=a[j];//賦給前面被拿走的a[i]while(i<j&&a[i]<=pivotKey)//從左向右掃描,找第一個碼值大于key的記錄,并交換到右邊i++;a[j]=a[i];//賦給前面被拿走的a[j]}a[i]=pivotKey;//分區元素放到正確位置quickSort(a,left,i-1);quickSort(a,i+1,right); }?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划 —— 背包问题 P01 ——
- 下一篇: 理论基础 —— 排序 —— 希尔排序