题目描述:对输入的n个数进行排序并输出。
解题思路:其实是很常规的排序题,但是为了一复习,所以采用快排的方法。这里就当是快速排序的代码实现练习好了。
快速排序是非常经典的一个算法,可以在对数规模的时间下实现对一组数的排序。
其基于分治的思想,每一趟排序把原组数划分为更小的范围进行排序,并且一定有一个数会在每趟排序下放在最终的位置。
用通俗的语言描述这个过程,就是从这一个分组的两头开始向中间遍历,一边遍历一边把大的放到右边,小的放到左边。
最后当low=high时停留在pivot的位置,再将一开始枢纽pivot的元素塞回去。
枢纽元素pivot最后所在的位置为其最终位置,最后以枢纽元素为中心把大分组的元素划分为两部分
递归调用快排函数,对于更小的部分继续排序、划分、再对更小的分组进行快排,再划分……
注:pivot的选取是任意的,这里为了方便每次选取最左元素作为枢纽。实际上每次如果选取的枢纽在一趟排序后恰能把这一组数据从中间划分为两部分最佳。
(一趟排序后pivot左边的元素不一定有序,但比pivot元素小(<=);pivot右边的元素也同理,不一定有序,但比pivot元素大。(>=))
对于快排算法我一开始学习也是比较大头,时间久了就很熟悉了。想起大三上算法课的时候居然还和老师说快排是基于二分的思想。。。真是丢死人了
上学期复习排序的时候特意画了一张模拟的小漫画,现在不在身边。等下学期回学校再拍一下传上来放这里。
#include<stdio.h> void quick_sort(int *a,int l,int h) { if(l<h)//如果分组里还有两个以上的元素,继续排序 { int pivot=a[l]; int low=l; int high=h; while(low<high) { while(low<high&&a[high]>=pivot) { high--; } a[low]=a[high]; while(low<high&&a[low]<=pivot) { low++; } a[high]=a[low]; } a[low]=pivot; quick_sort(a,l,low-1); quick_sort(a,low+1,h); } else return ; } int main() { int a[10001]; int n,i; while(scanf("%d",&n)!=EOF) { int len=n; i=0; while(n--) { scanf("%d",&a[i]); i++; } quick_sort(a,0,len-1); for(i=0;i<len;i++) { printf("%d ",a[i]); } } return 0; }