AcWing 787. 归并排序

https://www.acwing.com/problem/content/789/

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n;
int q[N],tmp[N];
void merge_sort(int q[],int l,int r)
{
    if(l>=r)  return ;//如果当前区间里面只有一个数或者没有数的话,就不用排序,直接返回
    int mid=l+r>>1; //取区间的中点
    merge_sort(q,l,mid),merge_sort(q,mid+1,r);  //递归排序左边和右边
    int k=0,i=l,j=mid+1;
    while(i<=mid&&j<=r)
        if(q[i]<=q[j])  tmp[k++]=q[i++];
        else tmp[k++]=q[j++];
    while(i<=mid)  tmp[k++]=q[i++];    //可能还有的数字没有放进去
    while(j<=r)   tmp[k++]=q[j++];  //归并
    for(i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];  //把临时数组里面的数字 放回去
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);
    merge_sort(q,0,n-1);
    for(int i=0;i<n;i++)  printf("%d ",q[i]);
    return 0;
 } 

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11746275.html

时间: 2024-07-31 15:29:02

AcWing 787. 归并排序的相关文章

归并排序模板(ACwing 787)

归并排序其实也是分治的思想 首先归并排序跟快排一样同样需要考虑分界点 归并排序的分界点都是取中间值 其次归并排序需要递归排序左边和右边 最后一部也是最难的一部需要将分开的归并排序合二为一 #include<iostream> using namespace std; int n; const int N= 100010; int a[N],tmp[N];//归并排序需要多定义一个数组 void merge_sort(int a[],int l,int r) { if(l>=r)retur

快排+归并+整数二分

tips: 1.注意边界处理,避免出现死循环 785. 快速排序 /* eg:2 1 2 用i则不能取到左边界,把x取值改成向上取整 用j则不能取到右边界,把x取值改成向下取整 取到边界会导致递归死循环 */ #include<iostream> #include<cstdio> using namespace std; const int N=1e6+10; int n; int q[N]; void quick_sort(int q[], int l, int r){ if(l

算法基础课相关代码模板

算法基础课相关代码模板 活动链接 -- 算法基础课 快速排序算法模板 -- 模板题 AcWing 785. 快速排序 void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x);

AcWing 107. 超快速排序(归并排序 + 逆序对)

在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 5 9. 您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序. 输入格式 输入包括一些测试用例. 每个测试用例的第一行输入整数n,代表该用例中输入序列的长度. 接下来n行每行输入一个整数aiai,代表用例中输入序列的具体数据,第i行的数据代表序列中第i个数. 当输入用例中包含

AcWing:108. 奇数码问题(归并排序 + 逆序数)

你一定玩过八数码游戏,它实际上是在一个3×3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3×3的网格中. 例如: 5 2 8 1 3 _ 4 6 7 在游戏过程中,可以把空格与其上.下.左.右四个方向之一的数字交换(如果存在). 例如在上例中,空格可与左.上.下面的数字交换,分别变成: 5 2 8 5 2 _ 5 2 8 1 _ 3 1 3 8 1 3 7 4 6 7 4 6 7 4 6 _ 奇数码游戏是它的一个扩展,在一个nn×nn的网格中进行,其中nn为奇数,1个空格和1

Inversion (hdu 4911 树状数组 || 归并排序 求逆序对)

Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2003    Accepted Submission(s): 787 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers fo

AcWing 785. 快速排序

https://www.acwing.com/problem/content/787/ 快排   双向指针 #include<bits/stdc++.h> using namespace std; const int N=100000; int n; int q[N]; void quick_sort(int q[],int l,int r) { if(l>=r) return ; int x=q[l],i=l-1,j=r+1; //双向指针 while(i<j) { do { i

归并排序和快速排序模版

摘自Acwing 归并排序 1 #include <iostream> 2 using namespace std; 3 4 const int N = 1e5 + 10; 5 6 int n; 7 int q[N], tmp[N]; 8 void merge_sort(int q[], int l, int r) 9 { 10 if (l >= r) 11 return; 12 int mid = l + r >> 1; 13 merge_sort(q, l, mid),

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"