【模板】快速排序
快速排序
基本概念:快速排序(简称快排)可以说是对冒泡排序的一种改进,时间复杂度为O(nlog^2n)速度非常快,是目前被认为最好的一种排序方法。
思想:通过第一趟排序将待排序记录分成独立的两部分,其中一部分记录的关键字均比另一部分的关键字要小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
进行步骤:首先假设待排序的数列为{a[l],a[l+1],a[l+2]......a[r}。
1.任意选取一个记录(可以选取中间一个)。
2.然后重新排列其余记录小于记录的数全部放到左子序列中,大于它的数全部放到右子序列当中去。(这个记录记为mid为分界线,将序列分为两个子序列)。
具体做法:设指针i和j,初始值分别为i=l和j=r,分别指向序列的头尾,从j开始寻找小于mid的第一个关键字,然后从i所指位置开始向后搜索,找到第i个>mid的记录,然后互相交换,然后不断重复,直到i>j为止。
代码实现:
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<cmath> #include<ctime> #include<cstring> using namespace std; int n,a[100001],len; int main() { scanf ("%d",&n); for (int b=1;b<=n;++b) { scanf ("%d",&a[b]); len=b; while (len!=1) { if (a[len]<a[len/2]) { int t=a[len/2]; a[len/2]=a[len]; a[len]=t; } else break; len/=2; } } for (int b=1;b<=n;++b) { printf ("%d ",a[1]); a[1]=a[n-b+1];len=1; while(len*2<=n-b) { int next=len*2; if ((a[next]>a[next+1] && next<n-b))next++; if (a[len]<=a[next])break; int t=a[len];a[len]=a[next];a[next]=t; len=next; } } return 0; }
或者是:
#include<iostream> #include<cstdio> #define MAXN 101 using namespace std; int a[MAXN]; void qsort(int l,int r) { int i,j,mid,p; i=1,j=r; mid=a[(l+r)/2]; do{ while(a[i]<mid)i++; while(a[i]>mid)j--; if(i<=j) { p=a[i];a[i]=a[j];a[j]=p; i++;j--; } }while(i<=j) if(l<j) qsort(l,j); if(i<r) qsort(i,r); } int main() { int n,i; cin>>n; for(i=1,i<=n;i++) cin>>a[i]; qsort(1,n); for(i=1;i<+n;i++) cout<<a[i]<<" "; cout<<endl; return 0; }