天天看点

快速排序



#include<stdio.h>

#include<stdlib.h>

void

change(int

*pa,

int *pb)//根据地址交换两个变量的值

{

int

temp = *pa;

*pa = *pb;

*pb =

temp;

}

show(int

*p,

n)//显示数组状态

printf("\n此时此刻数组的状态");

for (int

i = 0;

i <

n;

i++)

printf("%5d",

p[i]);//*(p+i)

void 

quicksort(int

left,

right)

printf("\n要处理的子序列   

");

i =

left;

i <=

right;

i++)//从左到右打印要处理子序列

p[i]);

left;//a[0]

//最左边的数

j =

right + 1;//a[10]

最右边的数

if (i

< j)//循环的可用条件

do

i++;

} while (p[i]<p[left]

&& i <=

right);//统计多少个小于它的数,p[i]就是最右边小于第一个数的数

j--;

} while (p[j]

>= p[left]

&& j>left);//统计下标最左边大于第一个数的数

printf("\na[%d]=%d,a[%d]=%d",

i,

p[i],

j,

p[j]);//打印中间数据

< j)

change(&p[i],

&p[j]);

show(p,

10);

} while (i

< j);///j作为分割点    

小于的数往左,大于的数往右

change(&p[left],

&p[j]);//以j作为分割点

printf("\np[%d]=%d",

p[j]);

10);//

quicksort(p,

j - 1);//分割左边

j + 1,

right);//分割右边

main()

a[10] = { 19, 9, 20, 8, 38, 49, 11, 58, 34, 22 };

show(a,

10);//显示数组没有排序的状态

quicksort(a,

0, 10 - 1);

system("pause");