快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。
思想:
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