<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
//交换位置传入两个地址
void Swap(int *a, int *b)
{
int temp;
temp = *b;
*b = *a;
*a = temp;
}
//求出三个数的中位数而且将pivot(keyword放在i-1的位置上)
int Median3(int A[],int Left,int Right) //left = 起点 right = 终点
{
int Center = (Left + Right) / 2; //找出中间位置用Center存储
if(A[Left] > A[Center]) //保证左边比中间小
{
Swap(&A[Left],&A[Center]);
}
if(A[Left] > A[Right]) //保证右边比中间小
{
Swap(&A[Left],&A[Right]);
}
if(A[Center] > A[Right]) //保证中间比右边小
{
Swap(&A[Center],&A[Right]);
}
Swap(&A[Center],&A[Right-1]); //将中位数藏到right-1的位置上
return A[Right-1];
}
//排序算法的实现传入三个參数 Left = 起点 Right = 终点
void Quicksort(int A[],int Left,int Right)
{
int Pivot = Median3(A,Left,Right); //做子集划分的时候处理keyword
int i = Left; //不用考虑第一个和最后一个在中位数里已经处理过
int j = Right-1;
//子集划分不断循环
while(1)
{
while ( A[ ++i ] < Pivot ) { }
while ( A[ --j ] > Pivot ) { }
if ( i < j )
Swap( &A[i], &A[j] );
else break;
}
Swap(&A[i],&A[Right-1]); //继续藏位置
if(Left < i-1)
Quicksort(A,Left,i-1); //从中间位置到初始位置
if(i+1 < Right) //注意这里是三个数已排好了
Quicksort(A,i+1,Right); //两个递归所以两个推断条件
}
//对快排进行封装
void Quick_Sort(int A[],int N)
{
Quicksort(A,0,N-1);
}
int main()
{
int a[14] = {10,7,2,5,3,4,9,11,15,12,20,902,50,30};
Quick_Sort(a,14);
for(int i=0;i<14;i++)
{
printf("%d ",a[i]);
}
getchar();
}