代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 /* 5 这里的left和right指的就是数组首末元素 6 partition1用的单指针划分,以当前数组末尾元素为基准 7 partition2用的双指针划分,以当前数组首部元素为基准 8 */ 9 static int partition1(vector<int> &v, int left, int right){ 10 int num = v[right]; 11 int i = left - 1; 12 for(int j=left;j<right;j++){ 13 if(v[j] <= num){ 14 i++; 15 swap(v[i], v[j]); 16 } 17 } 18 swap(v[i+1], v[right]); 19 return i+1; 20 } 21 22 static int partition2(vector<int> &v, int left, int right){ 23 int num = v[left]; 24 int start = left; 25 while(left < right){ 26 while(left<right && v[right]>num) 27 --right; 28 while(left<right && v[left]<=num) 29 ++left; 30 swap(v[left], v[right]); 31 } 32 swap(v[left], v[start]); // 这里很容易出问题,一定是交换容器两个元素 33 return left; 34 } 35 36 static void quickSort(vector<int> &v,int left, int right){ 37 if(left >= right) 38 return; 39 int mid = partition2(v, left, right); 40 quickSort(v, left, mid-1); 41 quickSort(v, mid+1, right); 42 return; 43 } 44 45 int main(){ 46 int n; 47 while(cin>>n){ 48 vector<int> v(n); 49 for(int i=0;i<n;i++) 50 cin>>v[i]; 51 quickSort(v, 0, n-1); 52 for(int num : v) 53 cout<<num<<","; 54 } 55 return 0; 56 }
快排是目前综合性能最好的排序算法,是一种不稳定的排序算法
平均时间复杂度O(nlogn)
但是很吃数据初始排布,对于基本有序的数组,时间复杂度退化为n²
浙公网安备 33010602011771号