#include<stdio.h>
#include<stdlib.h>
void change(int *pa, int *pb)//根据地址交换两个变量的值
{
int temp = *pa;
*pa = *pb;
*pb = temp;
}
void show(int *p, int n)//显示数组状态
{
printf("\n此时此刻数组的状态");
for (int i = 0; i < n; i++)
{
printf("%5d", p[i]);//*(p+i)
}
}
void Quicksort(int *p, int left, int right)
{
printf("\n要处理的子序列 ");
for (int i = left; i <= right; i++)//从左到右打印要处理子序列
{
printf("%5d", p[i]);
}
int i = left;//a[0] //最左边的数
int j = right + 1;//a[10] 最右边的数
if (i < j)//循环的可用条件
{
do
{
do
{
i++;
} while (p[i]<p[left] && i <= right);//统计多少个小于它的数,p[i]就是最右边小于第一个数的数
do
{
j--;
} while (p[j] >= p[left] && j>left);//统计下标最左边大于第一个数的数
printf("\na[%d]=%d,a[%d]=%d", i, p[i], j, p[j]);//打印中间数据
if (i < j)
{
change(&p[i], &p[j]);
}
show(p, 10);
} while (i < j);///j作为分割点 小于的数往左,大于的数往右
change(&p[left], &p[j]);//以j作为分割点
printf("\np[%d]=%d", j, p[j]);
show(p, 10);//
Quicksort(p, left, j - 1);//分割左边
Quicksort(p, j + 1, right);//分割右边
}
}
void main()
{
int a[10] = { 19, 9, 20, 8, 38, 49, 11, 58, 34, 22 };
show(a, 10);//显示数组没有排序的状态
Quicksort(a, 0, 10 - 1);
show(a, 10);//显示数组没有排序的状态
system("pause");
}