void quicksort(int left, int right) {
int i, j, mid, temp;
i = left;
j = right;
mid = a[(left + right) / 2];
do {
while (a[i] < mid) i++;
while (a[j] > mid) j--;
if (i <= j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
} while (i <= j);
if (i < right) quicksort(i, right);
if (left < j) quicksort(left, j);
}
left,right都表示数组的下标,先找到数组中间的数,然后进入循环,当左指针小于mid的时候,符合要求,左指针就往后移,当右指针大于mid的时候,符合要求,右指针往前移,当走到后面的if的时候,说明找到了a[i]>mid,a[j]<mid的情况,这个时候就需要将两个数换位置,然后左指针后移一位,右指针后移一位。依次循环,这个循环只是将比mid大的放右边,比mid小的放左边,但是mid的左右还没有排序,所以跳出循环以后,,如果i<right,就继续排mid右边的数字,如果left<j就继续排mid左边的数字。
#include<stdio.h>
int a[1000000];
int n;
void quicksort(int left, int right);
int main(void) {
scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
quicksort(0, n-1);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
void quicksort(int left, int right) {
int i, j, mid, temp;
i = left;
j = right;
mid = a[(left + right) / 2];
do {
while (a[i] < mid) i++;
while (a[j] > mid) j--;
if (i <= j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
} while (i <= j);
if (i < right) quicksort(i, right);
if (left < j) quicksort(left, j);
}