排序
排序在信息学奥赛中也是一个很重要的算法,虽然可以只要会快排,走遍天下也不怕。
写个blog简单整理下学习过的排序算法。
一,STL sort
调用库函数 #include<algorithm>基本写法 sort(a+1,a+n+1)
快速排序是一个不稳定的排序算法
对基本写法的说明:sort是对一个数组排序,其中+后面的数,分别代表下标,就是说sort会对数组a,1<=i<n+1的元素排序,sort的排序区间是左开右闭的。
库函数默认的sort是从小到大排序,但有时我们需要从大到小排序,或者给结构体排序,这时我们需要自定义一个函数cmp
1,从大到小排序
inline bool cmp(int x,int y) { return x>y; } sort(a+1,a+n+1,cmp);
2,给结构体排序
inline bool cmp(node x,node y) { return x.len<y.len; } sort(a+1,a+n+1,cmp);
只需要定义两个结构体变量,然后写上根据结构体哪个元素排序。
3,有时我们针对结构体多个元素排序的时候,还可以改写cmp
二,归并排序
归并排序是稳定的排序算法,时间复杂度O(nlogn)。
归并排序的详解请见分治算法的blog
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int num[2333],a[2333],n; inline void m_sort(int l,int r) { if(l==r) return; int mid=(l+r)>>1; m_sort(l,mid); m_sort(mid+1,r); int p1=l,p2=mid+1; for(int i=l;i<=r;i++) { if(p1<=mid&&p2<=r) { if(num[p1]<num[p2]) a[i]=num[p1++]; else a[i]=num[p2++]; } else { if(p1<=mid) a[i]=num[p1++]; else a[i]=num[p2++]; } } for(int i=l;i<=r;i++) num[i]=a[i]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&num[i]); m_sort(1,n); for(int i=1;i<=n;i++) printf("%d ",num[i]); return 0; }
三,桶排序
桶排序的思想很好啊qwq
桶排序就是若待排序的值在一个明显的有限范围内时,可设计有限个有序桶,待排序的值装入对应的桶,
桶号就是待排序的值,顺序输出各个桶的值,得到有序的序列。
如果数据范围非常大,我们可以用HASH优化就得到了哈希表,
虽然桶排序的应用不多,但其思想应用较多。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int num[2333],a[2333],n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); a[num[i]]++; } for(int i=1;i<=1000;i++) while(a[i]>0) printf("%d ",i),a[i]--; return 0; }
祝大家NOIP2019 RP++ SCORE++