快速排序
在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。
快速排序是对冒泡排序的一种本质改进。
基本思想:通过一趟扫描后,使得排序序列的长度能大幅度地减少。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
View Code
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int const ic_limit = 100002; 7 8 void vInputData(int &iNum,int iArr[]); 9 void vQuickSort(int iArr[],int iLeft,int iRight); 10 void vPrintAns(int iNum,int iArr[]); 11 12 int main() 13 { 14 int iNum; 15 int iArr[ic_limit]; 16 17 memset(iArr,0,sizeof(iArr)); 18 vInputData(iNum,iArr); 19 vQuickSort(iArr,1,iNum); 20 vPrintAns(iNum,iArr); 21 22 return 0; 23 } 24 25 void vInputData(int &iNum,int iArr[]) 26 { 27 cin >> iNum; 28 for(int i=1; i<=iNum; i++) 29 { 30 cin >> iArr[i]; 31 } 32 } 33 34 void vQuickSort(int iArr[],int iLeft,int iRight) 35 { 36 int iKeyValue; 37 int iLow; 38 int iHigh; 39 40 //以iKeyValue为基准 41 iKeyValue = iArr[iLeft]; 42 iLow = iLeft; 43 iHigh = iRight; 44 while(iLow < iHigh) 45 { 46 while((iLow < iHigh) && (iArr[iHigh] >= iKeyValue)) 47 { 48 iHigh --; 49 } 50 if(iLow < iHigh) 51 { 52 iArr[iLow] = iArr[iHigh]; 53 iLow ++; 54 } 55 while((iLow < iHigh) && (iArr[iLow] <= iKeyValue)) 56 { 57 iLow ++; 58 } 59 if(iLow < iHigh) 60 { 61 iArr[iHigh] = iArr[iLow]; 62 iHigh --; 63 } 64 } 65 iArr[iLow] = iKeyValue; 66 67 if(iLeft < (iLow-1)) 68 { 69 //对左区间递归排序 70 vQuickSort(iArr,iLeft,iLow-1); 71 } 72 if((iLow+1) < iRight) 73 { 74 //对右区间递归排序 75 vQuickSort(iArr,iLow+1,iRight); 76 } 77 } 78 79 void vPrintAns(int iNum,int iArr[]) 80 { 81 for(int i=1; i<iNum; i++) 82 { 83 cout << iArr[i] << " "; 84 } 85 cout << iArr[iNum] << endl; 86 }

浙公网安备 33010602011771号