HDU1425快速排序
写本篇的目的是防止自己再忘了快排的原理和代码的实现,好长时间都没编,竟然不会了,O__O"…,并且还有在C++中的快排的库函数的应用,以供以后参考。
看了网上大牛的解释,受益匪浅,快排一般说是分治法,实际上在分治以前还有一个步骤,就是初步排序。以从大到小为例,我学习的是在给定的一组数中,以第一个为基准,找比基准大的数,依次放在基准数的后面,直到找不到比基准数大的数为止,并且记下最后一个比基准大的数的下标,交换基准与最后一个比基准大的数的位置,从而得到在基准以前的都比基准大,以后的都比基准小,这样初步排序就完成了。接下来就是分治,就是重复递归调用本函数排基准以前的,和基准以后的,结束的条件是区间两端相等,这样快速排序就完成了。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 1000010; int a[maxn]; void qsort(int st,int ed) { int t; int flag=st; if(st>=ed)return ; for(int i=st,j=st+1;j<=ed;j++)//基准是a[1]; { if(a[j]>a[st])//如果找到了比a[1]大的数a[j] { i++; t=a[j]; a[j]=a[i];//就把a[j]放在a[st]的后面 a[i]=t; flag=i;//标记最后一个比a[st]大的数 } } t=a[st];//交换基准和最后一个比基准大的数大的数 a[st]=a[flag]; a[flag]=t; qsort(st,flag-1);//分治递归 qsort(flag+1,ed); return ; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); qsort(1,n); for(int i=1;i<=m;i++) { if(i>1)printf(" "); printf("%d",a[i]); } printf("\n"); } return 0; }
用C++库函数的排序:(sort)
sort这个函数就是标准库中的快速排序,使用方法:在C++中加一个头文件#include<algorithm> (学c的同学可以在c的基础上加上C++的头文件#include<iostream> 加上#include<algorithm> 加上using namespace std; 就行了,如下代码,实际上在C++中#include<stdio.h>和#include<cstdio>是一样的),再调用函数sort(a,a+n) 其中a表示你所用数组的首地址(如果没学指针的话,就记住行了),a+n表示要排的末尾,就是对从数组a[0]到a[n-1]的所有数排序,如果想从a[1]到a[n]的话,就写成sort(a+1,a+n+1)就行了。如果你想让它从大到小排序的话,还需要自己编一个cmp函数:
int cmp(int a,int b) { return a>b; }
并且sort要写成:sort(a,n,cmp); 这样你就不用自己编啦~\(≧▽≦)/~
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn = 1000010; int a[maxn]; int cmp(int a,int b) { return a>b; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1,cmp); for(int i=1;i<=m;i++) { if(i>1)printf(" "); printf("%d",a[i]); } printf("\n"); } return 0; }
最后吐槽一下,以前一直以为调用qsort是快排,sort就是普通排序,但刚试了一下,反而是sort 快,问了一下学长,原来qsort是自己编的并且用了sort的,所以一般是用sort 的,但在这里也记一下qsort的用法。
要用头#include<algorithm>,从小到大排序,从a[0]到a[n-1]排序:qsort(a,n,sizeof(a[0]),cmp); 还得自己编一个cmp函数:
int cmp(const void *a,const void *b) { return (*(int *)a-*(int *)b); }
如果想从大到小,从a[1]到a[n]的话,就写成qsort(a+1,n,sizeof(a[1]),cmp); 并且把cmp函数中返回的ab调换:
int cmp(const void *a,const void *b) { return (*(int *)b-*(int *)a); }
总算写完了。。。。希望能给迷茫的童鞋帮助。

浙公网安备 33010602011771号