快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。
思想:
1、在待排序的元素任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2、将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3、对左右两个分区重复以上步骤直到所有元素都是有序的;
4、不断地进行递归下去,好像二分法一样(二分法后,然后对每一边再进行二分法)。
所以我是把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态。
下面再看看如图理解下吧:
然后对元素5两边的元素也重复以上操作,直到元素达到有序状态。
代码如下:
#include <stdio.h>
void find_frst(int *s,int left,int right)
{
int i=left,j=right,temp;
if(left>=right)
return;
temp=s[i]; //以数组的第一个数为比较值,保存到temp中 ,基准元素
while(i<j)
{
while(j>i && s[j]>=temp) //j--,把第一个比temp小的值放到左侧
j--; //从右往左扫描
s[i]=s[j];
while(i<j && s[i]<=temp) //i++,把第一个比temp大的值放到右侧
i++; //从左往右扫描
s[j--]=s[i]; //保存最大值到s[j]
}
s[i]=temp; //基准元素归位
find_frst(s,left,i-1); //对基准元素左边的元素进行递归排序
find_frst(s,i+1,right); //对基准元素右边的进行递归排序
}
int main(void)
{
int i=0,s[100],n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&s[i]);
find_frst(s,0,n-1); //快速排序,升序
for(i=0;i<n;i++)
printf("%d",s[i]);
printf("\n");
}
输入:
5 7 1 8 4
打印:
1 4 5 7 8