模板
用两个指针i、j,确定好x,再令小于x的放在x左边,大于x的放在x的右边,通过do..while来实现,让l指针向后移动,直到遇见大于x的值,让r指针向前移动,直到遇见小于x的值(因为边界问题,i要等于l-1,j要等于r+1)此时,交换i、j指向的元素,从而实现把小于x的放在x左边,大于x的放在x的右边,又因为这一行为需要重复做,所以放在while里面,循环条件是i<j。
后面使用递归来分别排序x的左边、x的右边。
#include<stdio.h>
void quick_sort(int* arr, int l, int r)
{
if (l >= r)
{
return;
}
else
{
int i = l - 1;
int j = r + 1;
int x = arr[(l + r) / 2];
while (i < j)
{
do
{
i++;
} while (arr[i] < x);
do
{
j--;
} while (arr[j] > x);
if (i < j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
quick_sort(arr, l, j);
quick_sort(arr, j + 1, r);
}
}
int main()
{
int n = 0;
int arr[100000] = { 0 };
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
quick_sort(arr, 0, n - 1);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}