1 #include <iostream> 2 #include <cstdlib> 3 4 #define ARR_SIZE 10 5 6 using namespace std; 7 8 9 void quicksort(int a[], int lo, int hi); 10 int partition(int a[], int lo, int hi); 11 void CreateRandArr(int a[]); 12 13 int main() 14 { 15 int a[ARR_SIZE]; 16 int i; 17 CreateRandArr(a); 18 quicksort(a, 0, ARR_SIZE-1); 19 cout << "after sort: " << endl; 20 for(i=0;i<ARR_SIZE;i++) 21 { 22 cout << a[i] << ' ' ; 23 } 24 25 return 0; 26 } 27 28 void quicksort(int a[], int lo, int hi) 29 { 30 if(lo >= hi) return; 31 int j = partition(a, lo, hi); 32 quicksort(a, lo, j-1); 33 quicksort(a, j+1, hi); 34 35 } 36 37 /* 算法解析:分治思想:把索引为lo的元素放中间作为分界,使左边的元素都小于它,右边的元素都大于他,返回它的索引 */ 38 int partition(int a[], int lo, int hi) 39 { 40 int i=lo,j = hi+1, temp; 41 while(true) 42 { 43 while(a[lo] >a[++i])if(i==hi)break; /* 这两个while中的if语句都是冗余的,想想看why? */ 44 while(a[lo]<a[--j])if(j==lo)break; 45 if(i>=j)break; 46 temp = a[i]; 47 a[i] = a[j]; 48 a[j] = temp; 49 } 50 temp = a[lo]; /* 注意这个地方,把分界元素(a[lo])与a[j]进行交换(而不是a[i]),返回j(这里只能死记硬背了) */ 51 a[lo] = a[j]; 52 a[j] = temp; 53 54 return j; 55 56 } 57 58 void CreateRandArr(int a[]) 59 { 60 int i; 61 for(i=0;i<ARR_SIZE;i++) 62 { 63 a[i] = rand() % 100; 64 cout <<a[i] << ' ' ; 65 } 66 cout << endl; 67 }