快速排序

 1. 确定分界点

取左边界,取中值,取右边界,随机取

2. 根据分界点将区间分为两半,左边所有的数都小于等于x,右边所有的数都大于等于x 

3. 递归处理左右两端

 

一种方法:利用额外空间

1. a[], b[]

2 在q[l~r]里面, q[i] <= x   --> x -> a[]

 q[i] >= x   --> x -> b[]

3. a[] --> q[], b[] --> q[]

 

改进,双指针

思路:使用i, j,i左边元素都小于等于x,j右边元素都大于等于x,当i,j相遇,则停止

 

 1 void quick_sort(int q[], int l, int r)
 2 {
 3     if(l >= r) return;
 4     int x = q[l], i = l-1, j = r + 1;
 5     while(i < j) //注意是i,j,不是l,r
 6     {
 7         do i++; while(q[i] < x);
 8         do j--; while(q[j] > x);
 9         if(i < j) swap(q[i], q[j]);//注意是i,j,不是l,r
10     }
11     quick_sort(q, l, j); //注意第4行x的取值,如果11行右边界取i-1,则x不能等于q[l],可用 [1, 2]验证
12     quick_sort(q, j+1, r);
13 }

 

1. 初始

2. 指针移动

3. 交换元素3,3

4. 指针移动

5. 交换元素2, 6

6. 指针移动

 

posted @ 2019-07-08 01:48  roov  阅读(10)  评论(0编辑  收藏  举报