题解:
quick sort三部曲
核心思想:
分治, 先找到一个分界点,然后分区使得左分区 left <= x
, 右分区 right >= x
, 然后递归处理左右分区
(注意:分区后,分界点x并不一定在左右分区的边界上,并且左右分区也是无序的)
step1: 初始化 i = l - 1, j = r + 1
, 参照值 x = a[(l+r)>>1]
step2: 双指针从两侧找, i
指针找第一个不满足 a[i] < x
的位置, j
指针找第一个不满足 a[j] > x
的位置,
此时若满足 i < j
,则交换 a[i]
和 a[j]
step3: 递归调用前后两部分,记得下标:当参照值 x
可以取到 l
的时候,要以 j
为临界点调用;当 x
可以取到 r
的时候,要以 i
作为临界点区分调用
c语言
#include<stdlib.h>
#include<stdio.h>
#define MAX_LEN 100010
int a[MAX_LEN];
int n;
void quick_sort(int a[], int l, int r){
if(l >= r) return ;
int i = l - 1, j = r + 1, x = a[(l + r) >> 1];
while(i < j){
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
quick_sort(a, l, j);
quick_sort(a, j + 1, r);
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
quick_sort(a, 0, n - 1);
for(int i = 0; i < n; i++) printf("%d ", a[i]);
return 0;
}
把j变为i为什么
就出错了