1 void quick_sort(int a[], int l, int r) 2 { 3 if (l < r) 4 { 5 int i,j,x; 6 7 i = l; 8 j = r; 9 x = a[i]; 10 while (i < j) 11 { 12 while(i < j && a[j] > x) 13 j--; // 从右向左找第一个小于x的数 14 if(i < j) 15 a[i++] = a[j]; 16 while(i < j && a[i] < x) 17 i++; // 从左向右找第一个大于x的数 18 if(i < j) 19 a[j--] = a[i]; 20 } 21 a[i] = x; 22 quick_sort(a, l, i-1); /* 递归调用 */ 23 quick_sort(a, i+1, r); /* 递归调用 */ 24 } 25 }
上图只是给出了第1趟快速排序的流程。在第1趟中,设置x=a[i],即x=30。
(01) 从"右 --> 左"查找小于x的数:找到满足条件的数a[j]=20,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。
(02) 从"左 --> 右"查找大于x的数:找到满足条件的数a[i]=40,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。
(03) 从"右 --> 左"查找小于x的数:找到满足条件的数a[j]=10,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。
(04) 从"左 --> 右"查找大于x的数:找到满足条件的数a[i]=60,此时i=2;然后将a[i]赋值a[j],此时j=3;接着从右往左遍历。
(05) 从"右 --> 左"查找小于x的数:没有找到满足条件的数。当i>=j时,停止查找;然后将x赋值给a[i]。此趟遍历结束!
按照同样的方法,对子数列进行递归遍历。最后得到有序数组;
快速排序实现代码:
1 #include <iostream> 2 using namespace std; 3 void quickSort(int* a, int l, int r) 4 { 5 if (l < r) 6 { 7 int i,j,x; 8 i = l; 9 j = r; 10 x = a[i]; 11 while (i < j) 12 { 13 while(i < j && a[j] > x) 14 j--; // 从右向左找第一个小于x的数 15 if(i < j) 16 a[i++] = a[j]; 17 while(i < j && a[i] < x) 18 i++; // 从左向右找第一个大于x的数 19 if(i < j) 20 a[j--] = a[i]; 21 } 22 a[i] = x; 23 quickSort(a, l, i-1); /* 递归调用 */ 24 quickSort(a, i+1, r); /* 递归调用 */ 25 } 26 } 27 int main() 28 { 29 int i; 30 int a[] = {30,40,60,10,20,50}; 31 int ilen = (sizeof(a)) / (sizeof(a[0])); 32 cout << "before sort:"; 33 for (i=0; i<ilen; i++) 34 cout << a[i] << " "; 35 cout << endl; 36 quickSort(a, 0, ilen-1); 37 cout << "after sort:"; 38 for (i=0; i<ilen; i++) 39 cout << a[i] << " "; 40 cout << endl; 41 return 0; 42 }