一、算法描述
- 一个基准,两个指针,一个前指针,一个后指针,前指针负责比基准小的数,后指针负责比基准大的数
- 前指针向后移动的过程中如果遇到比基准大的数就停止移动,交换前后指针的值;后指针向前移动的过程中如果遇到比基准小的数就停止移动,交换前后指针的值
- 直到前后指针相遇
- 然后两边分别再进行一次快速排序
二、快速排序代码
void quick(int a[],int low,int high)
{
int i,j,temp;
if(low<high)
{
i = low;
j = high;
temp = a[low];//暂存基准点
while(i<j)
{
while(i<j&&a[j]>temp)
j--;//比基准点大,j前移
if(i<j)
{
a[i] = a[j];//出现比基准点小的数
i++;
}
while(i<j&&a[i]<temp)
i++;//比基准点小,i后移
if(i<j)
{
a[j] = a[i];//出现比基准点大的数
j--;
}
}
a[i] = temp;
quick(a,0,i-1);//对i的左边快排
quick(a,i+1,high);//对i的右边快排
}
}
三、检测代码
#include<stdio.h>
void quick(int a[],int low,int high)
{
int i,j,temp;
if(low<high)
{
i = low;
j = high;
temp = a[low];//暂存基准点
while(i<j)
{
while(i<j&&a[j]>temp)
j--;//比基准点大,j前移
if(i<j)
{
a[i] = a[j];//出现比基准点小的数
i++;
}
while(i<j&&a[i]<temp)
i++;//比基准点小,i后移
if(i<j)
{
a[j] = a[i];//出现比基准点大的数
j--;
}
}
a[i] = temp;
quick(a,0,i-1);//对i的左边快排
quick(a,i+1,high);//对i的右边快排
}
}
int main()
{
int n,i;
printf("请输入需要排序的数的个数:\n");
scanf("%d",&n);
int a[n];
printf("请输入需要排序的数:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quick(a,0,n-1);
printf("快速排序的结果:\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
}