基础篇:
冒泡排序
特点:较为容易想到,是初学者耳熟能详的排序算法
优点:代码精练,易懂
缺点:效率不够高,一般比赛中可能会超时
代码:
#include<cstdio> using namespace std; int a[10000001]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n-1;i++) for(int j=1;j<=n-i;j++) { if(a[j]>a[j+1]) { int sb=a[j];a[j]=a[j+1];a[j+1]=sb; } } for(int i=1;i<=n;i++)printf("%d ",a[i]); }
中级篇:
简易“桶排序”
特点:可以用来排序并过滤掉重复部分
优点:速度快,简洁易懂
缺点:过分浪费内存(没有离散化的思想),遇到稍微大点的数字数组就不够开,限制性较大
代码:(原代码丢了,用图片代替)
提高篇:
快速排序
特点:利用二分思想
优点:速度较快,用途广
缺点:无
代码:
#include<cstdio> using namespace std; int a[10000001]; void qsort(int left,int right) { if(left>right)return; int i,j,temp; temp=a[left]; i=left;j=right; while(i!=j) { while(a[j]>=temp&&i<j)j--; while(a[i]<=temp&&i<j)i++; if(i<j) { int sb=a[j];a[j]=a[i];a[i]=sb; } } a[left]=a[i];a[i]=temp; qsort(left,i-1);qsort(i+1,right); } int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); qsort(1,n); for(int i=1;i<=n;i++)printf("%d ",a[i]); }
当然。若你不想手打代码,可以用algorithm库里自带的快排,
用法:(假设初始位置为0)sort(a,a+n)
技巧篇:
归并排序
特点:将两个有序数组合并为一个有序数组
优点:面对有序情况效率较高
缺点:有序的规定限制了它的用途
用法:
merge(数组A起位置,数组A终位置,数组B起位置,数组B终位置,排序结果储存数组的起位置,比较函数);