归并排序&快速排序模板

来自acwing y总

归并排序

题目

#include <iostream>

using namespace std;
const int maxn = 100000+9;
int a[maxn];
void merge_sort(int l,int r)
{
   if(l>=r) return ;
   int tmp[maxn];
   int mid = (l+r)>>1;
   merge_sort(l,mid);
   merge_sort(mid+1,r);
   int k = 0, i = l,j = mid+1;
   while(i<=mid&&j<=r)
   {
       if(a[i]<a[j]) tmp[k++] = a[i++];
       else tmp[k++] = a[j++];
   }
   while(i<=mid) tmp[k++] = a[i++];
   while(j<=r) tmp[k++] = a[j++];
   for(i=l,j=0;i<=r;i++,j++) a[i] = tmp[j];
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    merge_sort(0,n-1);
     for(int i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}


快速排序

题目
步骤:

  1. 找分界点和基准点
  2. 交换,使得x的左边都小于等于x,x的右边都大于等于x
  3. 递归
#include <iostream>

using namespace std;
const  int maxn = 1e5+9;
int a[maxn];
void qsort(int l,int r)
{
    if(l>=r) return ;//递归截至条件
    //第一步确定基准点
    int mid = (l+r)>>1;
    int i = l-1;
    int j = r+1;
    int x = a[mid];
    while(i<j)
    {
        do i++; while(a[i]<x);
        do j--; while(a[j]>x);
        if(i<j) swap(a[i],a[j]);
    }
    qsort(l,j);
    qsort(j+1,r);
}
int main()
{
   int n;
   scanf("%d",&n);
   for(int i=0;i<n;i++)
   {
       scanf("%d",&a[i]);
   }
    qsort(0,n-1);
     for(int i=0;i<n;i++)
   {
       printf("%d ",a[i]);
   }
    return 0;
}

posted @   翔村亲亲鸟  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示