快排思路:采用分治法,选择一个基准元素,比基准元素小的移动到左边,比基准元素大的移动到右边,从而把数组拆成了两个部分,对两部分进行递归,最终子序列长度为1,跳出递归
#include<stdio.h>
void kuaipai(int*,int,int);
int main(){
int i,j,k;
int a[5]={1,5,3,3,8};
kuaipai(a,0,4);
for(i=0;i<=4;i++)
{
printf("%d ",a[i]);
}
return 0;
}
void kuaipai(int* a,int L,int R){
int right=R,left=L;
if(left>=right)//这里不能改成==,防止第一个数字为1
{
return ;//递归函数的唯一出口,长度为1的序列为有序序列
}
int temp=a[left];//基准点
while(left<right)
{
//先右在左,为一次循环
while(a[right]>=temp&& left<right)//为了防止第一个数字为1
{
right--;
}
if(left<right)
{
a[left]=a[right];
left++;
}
while(a[left]<=temp&& left<right)
{
left++;
}
if(left<right)
{
a[right]=a[left];
right++;
}
if(left==right)//左右指针重合时,找到基准点的准确位置,放入基准点
{
a[right]=temp;
}
}
kuaipai(a, L, right-1);
kuaipai(a, right+1,R);
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/9c2f9840684f685435f7572d3e9b5d18.png)