快速排序

This commit is contained in:
flykhan 2023-07-07 10:15:59 +08:00
commit 4412ac3a37
1 changed files with 61 additions and 0 deletions

61
quick_sort.c Normal file
View File

@ -0,0 +1,61 @@
#include <stdio.h>
int a[101], n; // 定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left, int right)
{
int i, j, temp; // 定义局部变量
if (left > right)
return; // 结束递归
temp = a[left]; // temp中存的就是基准数
i = left; // i中存的就是左边的坐标最左边的坐标就是基准数的坐标
j = right; // j中存的就是右边的坐标
while (i != j)
{
// 找到右边小于基准数的数
// 顺序很重要,要先从右边开始找
while (a[j] >= temp && i < j)
j--;
// 找到左边大于基准数的数
// 再从左往右边找
while (a[i] <= temp && i < j)
i++;
// 当左右两边的数都找到,而且没有重合时,交换两个数在数组中的位置
if (i < j)
{
// 使用异或运算交换两个数
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
}
// 最终将基准数归位
a[left] = a[i];
a[i] = temp;
quicksort(left, i - 1); // 继续处理左边的,这里是一个递归的过程
quicksort(i + 1, right); // 继续处理右边的,这里是一个递归的过程
}
int main()
{
int i, j;
// 读入数据
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
quicksort(1, n); // 快速排序调用
// 输出排序后的结果
for (i = 1; i <= n; i++)
printf("%d\t", a[i]);
getchar();
getchar();
return 0;
}