发现自己根本不会写排序,于是去复习了几个排序算法...
最坏O(n^2)
的算法
冒泡排序
维护一个形如[无序区,有序区]的序列,每次通过交换相邻元素,把无序区里最大的元素移到有序区的前端。
选择排序
维护一个形如[有序区,无序区]的序列,每次从无序区里选择出最小的元素,放到有序区的后面。
插入排序
维护一个形如[有序区,无序区]的序列,每次把无序区里的第一个元素插入到有序区里合适的位置。
快速排序
随机选一个元素,将比该元素小的元素移到它的前面,比它大的移到后面。再对前后两个区间递归进行相同操作。对于随机数据,算法效率似乎甚至优于归并排序。同时代码实现时可以使用简洁但不好理解的swap
两个元素的方法。
#include<bits/stdc++.h>
using namespace std;
const int SIZE=100005;
#define Mid ((L+R)>>1)
void Quick_Sort(int L,int R,int A[])
{
if(R<=L)return;
int Flag=A[(L+R)/2],p=L,q=R;
while(p<=q)
{
while(A[p]<Flag)p++;
while(A[q]>Flag)q--;
if(p<=q)swap(A[p++],A[q--]);
}
Quick_Sort(L,q,A);
Quick_Sort(p,R,A);
}
int main()
{
int n,A[SIZE];
cin>>n;
for(int i=1;i<=n;i++)cin>>A[i];
Quick_Sort(1,n,A);
for(int i=1;i<=n;i++)cout<<A[i]<<" ";
return 0;
}
其他比较有意思的算法
归并排序
时间复杂度为稳定的 (O(nlog n))。
#include<bits/stdc++.h>
using namespace std;
const int SIZE=100005;
#define Mid ((L+R)>>1)
void Merge_Sort(int L,int R,int A[],int Tem[])
{
if(L==R)return;
Merge_Sort(L,Mid,A,Tem);
Merge_Sort(Mid+1,R,A,Tem);
int i=L,j=Mid+1,k=L-1;
while(i<=Mid&&j<=R)
{
if(A[i]<=A[j]) Tem[++k]=A[i++];
else Tem[++k]=A[j++];
}
while(i<=Mid)Tem[++k]=A[i++];
while(j<=R)Tem[++k]=A[j++];
for(i=L;i<=R;i++)A[i]=Tem[i];
}
int main()
{
int n,A[SIZE],Tem[SIZE];
cin>>n;
for(int i=1;i<=n;i++) cin>>A[i];
Merge_Sort(1,n,A,Tem);
for(int i=1;i<=n;i++)cout<<A[i]<<" ";
return 0;
}
桶排序
好像也很有意思。