数据结构: 快速排序

 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 }

猜你喜欢

转载自www.cnblogs.com/jianqiao123/p/12129795.html