排序

排序在算法里主要考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大的数字

posted @ 2021-03-11 15:16  冰糖ryj  阅读(35)  评论(0编辑  收藏  举报