天天看點

快速排序



#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");