快速排序
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. 指针移动