第三章 :查詢與排序-------3.6快排在工程實踐中的優化
未優化的快速排序:
T(n)=2T(n/2)+O(n)。
演算法時間複雜度:O(nlgn)。
當主元沒選好:(最大/最小):
時間複雜度: O(n²)。
三點中值法:
優化: 在p、r、mid之間,選一箇中間值作為主元
#include<iostream>
using namespace std;
//三點中值法
int partition(int A[],int p,int r){
//優化: 在p、r、mid之間,選一箇中間值作為主元
int midIndex=p+((r-p)>>1); //中間下標
int midValueIndex=-1; //中值的下標
if(A[p]<=A[midIndex]&&A[p]>=A[r]){
midValueIndex=p;
}
else if(A[r]<=A[midIndex]&&A[r]>=A[p]){
midValueIndex=r;
}
else{
midValueIndex=midIndex;
}
swap(A[p],A[midValueIndex]);
int pivot=A[p];
int left=p+1;//掃描指標
int right=r; //右側指標
while(left<=right){
//left不停往右走,直到遇到大於主元的元素
while(A[left]<=pivot) left++; //迴圈退出時,left一定是指向第一個大於主元的位置
while(A[right]>pivot) right--; //迴圈退出時,right一定是指向最後一個小於等於主元的位置
if(left<right){
swap(A[right],A[left]);
}
}
//while退出時,兩者交錯,且right指向的是最後一個小於等於主元的位置,也就是主元應該待的位置
swap(A[p],A[right]);
return right;
}
void quickSort(int A[],int p, int r){
if(p<r){
int q=partition(A,p,r);
quickSort(A,p,q-1);
quickSort(A,q+1,r);
}
}
int main(){
int arr[]={1,6,2,3,4,8,11,3,9,4,2,5,3};
quickSort(arr,0,12);
for(int i=0;i<13;i++){
cout<<arr[i]<<" ";
}
return 0;
}
結果:
絕對中值法:
//獲取絕對的中值數,,O(N)的樣子
int getMedian(int arr[],int p,int r){ //p:首下標; r:最後一個下標
int size=r-p+1; //陣列長度
//每五個元素一組, groupSize:組數
int groupSize=(size%5==0)?(size/5):(size/5+1);
//儲存各小組的中值
int medians[groupSize];
int indexOfMedians=0; //中值陣列medians 的下標
//對每一組進行插入排序
for(int j=0;j<groupSize;j++){
//單獨處理最後一組,因為最後一組可能不滿5個元素
if(j=groupSize-1){
insertionSort(arr , low: p+j*5 , high: r); //對最後一組進行插入排序
medians[indexOfMedians++]=arr[(p+j*5+r)/2]; //最後一組的中間的那個元素
}
else{
insertionSort(arr , low: p+j*5 , high: p+j*5+4);//對非最後一組進行插入排序
medians[indexOfMedians++]=arr[p+j*5+2]; //當前組(排序後)的中間的那個
}
}
//對medians排序
insertSort(medians,0,medians.length-1); //PS: C++對陣列不能用 陣列.length(), 對string可以
return medians[medians.length/2];
}
求出中值後,只需和第一個元素交換,後面程式碼相同。
待排序列表較短時,用插入排序
PS:n<=8; 插入排序( O(n(n-1)/2) )比快速排序( O(2n(lgn+1)) )要快。
n<=8, 插入排序; 否則,快速排序。
相關文章
- Mysql 慢查詢優化實踐MySql優化
- 第三章:查詢與排序(下)----------- 3.12 實踐_最小可用id是多少排序
- 第三章:查詢與排序(下)----------- 3.20桶排序排序
- 第三章:查詢與排序(下)----------- 3.19 計數排序排序
- 第三章:查詢與排序(下)----------- 3.21基數排序排序
- KunlunDB查詢優化(三)排序下推優化排序
- 第三章 :查詢與排序-------3.5快排之三指標分割槽法排序指標
- 第三章:查詢與排序(下)----------- 3.16堆的概念及堆排序思路排序
- 第三章 :查詢與排序-------3.4快排之雙向掃描分割槽法排序
- 視覺化服務編排在金融APP中的實踐視覺化APP
- 第三章:查詢與排序(下)----------- 3.28 特殊排序(利用sort函式)排序函式
- 第三章 :查詢與排序-------3.2你需要掌握的快速排序演算法排序演算法
- 第三章:查詢與排序(下)----------- 3.23 相關題解:排序陣列中找和的因子排序陣列
- 從理論到實踐,Mysql查詢優化剖析MySql優化
- 第三章:查詢與排序(下)----------- 3.14 逆序對個數排序
- exists與in子查詢優化優化
- MySQL索引與查詢優化MySql索引優化
- 大檔案排序優化實踐排序優化
- 第三章 :查詢與排序-------3.7分治模式的完美詮釋_歸併排序排序模式
- 第二章 :查詢與排序---------遞迴、查詢與排序補充排序遞迴
- 實踐分享 - MySQL優化 - 查詢去年待流失客戶的交易額MySql優化
- 第三章:查詢與排序(下)----------- 3.22 總結:10種排序演算法的對比分析排序演算法
- 查詢優化優化
- MySQL 的查詢優化MySql優化
- 第三章:查詢與排序(下)----------- 3.15基礎學習_樹、二叉樹、堆排序排序二叉樹
- 第三章:查詢與排序(下)----------- 3.9 最快效率求出亂序陣列中第k小的數排序陣列
- Serverless 工程實踐 | Serverless 應用優化與除錯祕訣Server優化除錯
- pgsql查詢優化之模糊查詢SQL優化
- 方法快取與查詢快取
- HBase查詢優化優化
- Oracle in 查詢優化Oracle優化
- join 查詢優化優化
- MySQL查詢優化MySql優化
- 第三章:查詢與排序(下)----------- 3.27 用計數排序解決員工年齡問題排序
- 第三章:查詢與排序(下)----------- 3.29 題解:判斷陣列的包含問題排序陣列
- Laravel Passport OAuth 資料庫查詢改快取優化LaravelPassportOAuth資料庫快取優化
- 美團搜尋中查詢改寫技術的探索與實踐
- 第三章:查詢與排序(下)----------- 3.11 趣味擴充_尋找發帖水王排序