D&C_快速排序
基本思想:
(1)分解:以a[p]为基准元素,将其排在正确位置,然后将待排序数组分为三段:a[s : p - 1],a[p],a[p + 1 : e]。
(2)递归求解
程序:
1 #include <iostream> 2 #include <iomanip> 3 #include <stdlib.h> 4 #include <ctime> 5 using namespace std; 6 7 int part(int a[], int s, int e) 8 { 9 srand((unsigned)time(NULL)); 10 int i = s + rand() % (e - s + 1); 11 //cout<<"i:"<<i<<endl; //just test 12 swap(a[s], a[i]); 13 int p = s+1; //Alert: 是s+1开始而不是s 14 int q = e; 15 while(p < q) //Good: 双管齐下 16 { 17 //Alert: 加上限制p < e 和 q > s以防越界 18 while(a[p] < a[s] && p < e) p++; 19 while(a[q] >= a[s] && q > s) q--; 20 //cout<<"q: "<<q<<endl; //just test 21 if(p < q) 22 { 23 swap(a[p], a[q]); 24 } 25 } 26 swap(a[q], a[s]); 27 return q; 28 } 29 30 void quick_sort(int a[], int s, int e) 31 { 32 if(s < e) 33 { 34 int div = part(a, s, e); 35 quick_sort(a, s, div - 1); 36 quick_sort(a, div + 1, e); 37 } 38 } 39 40 int main() 41 { 42 int a[] = {11,8,9,5,4,6,3,2,3}; 43 quick_sort(a,0,8); 44 for(int i = 0; i < 9; i++) 45 cout<<a[i]<<endl; 46 return 0; 47 }

浙公网安备 33010602011771号