排序
排序在算法里主要考2个点:归并排序和快速排序。
基本思想
- 归并排序:将数组划分为两部分,对每部分分别排序后,最后归并
- 快速排序:选择一个数字作为基准,将数组一分为二,左边小右边大,然后在分别对左右两边递归处理
代码模板
归并排序模板:
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],w[N];
void merge(int l,int r)
{
if(l>=r)return;
int mid=l+r>>1;
merge(l,mid),merge(mid+1,r);
int i=l,j=mid+1,cnt=0;
while(i<=mid&&j<=r)
{
if(a[i]<a[j])w[cnt++]=a[i++];
else w[cnt++]=a[j++];
}
while(i<=mid)w[cnt++]=a[i++];
while(j<=r)w[cnt++]=a[j++];
for(int i=l,j=0;i<=r;j++,i++)a[i]=w[j];
}
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
merge(0,n-1);
for(int i=0;i<n;i++)printf("%d ",a[i]);
return 0;
}
快速排序模板:
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
void qs(int l,int r)
{
if(l>=r)return ;
int i=l-1,j=r+1,x=a[l+r>>1];
while(i<j)
{
do i++; while(a[i]<x);
do j--; while(a[j]>x);
if(i<j)swap(a[i],a[j]);
}
qs(l,j),qs(j+1,r);
}
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
qs(0,n-1);
for(int i=0;i<n;i++)printf("%d ",a[i]);
return 0;
}
应用场景
归并排序的应用:逆序对
快速排序的应用:第k大的数字