归并排序模板(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)return; //拆分成一个的时候需要返回
    int mid=(l+r)>>1; // 取中间值
    merge_sort(a,l,mid);merge_sort(a,mid+1,r);//递归分开数组左边部分和右边部分
    int k=0,i=l,j=mid+1;//i j 代表两个指针指向左边部分和右边部分的元素然后可以逐渐向后移动
    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(int i=l,j=0;i<=r;i++,j++) a[i]=tmp[j];//在将tmp数组的值给a数组
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)  cin>>a[i];
    merge_sort(a,0,n-1);
    for(int i=0;i<n;i++) cout<<a[i]<<" ";
    return 0;
}添加一副图增加对归并排序的理

 

原文地址:https://www.cnblogs.com/zyz010206/p/12324634.html

时间: 2024-11-08 03:50:44

归并排序模板(ACwing 787)的相关文章

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; /

前缀和和差分模板(AcWing 795-798)

前缀和分一维前缀和和二维前缀和,前缀和可以帮我们快速统计一段范围内的合. 需要简单的理解 一维前缀和 —— 模板题 AcWing 795. 前缀和S[i] = a[1] + a[2] + ... a[i]:a[l] + ... + a[r] = S[r] - S[l - 1]: 二维前缀和 —— 模板题 AcWing 796. 子矩阵的和S[i, j] = 第i行j列格子左上部分所有元素的和以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:S[x2, y2] - S[x1 -

归并排序模板

归并:将两个或两个以上的有序表组合成一个新的有序表. 一般情况不用这种方式排序,只有在将多个有序序列整合成一个有序序列是才会用到归并排序,才能想归并效率体现的最高. 算法描叙: 1.设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1. 2.两两合并,得到 n/2 个长度为2或1的有序子序列. 3.再两两合并,--如此重复,直至得到一个长度为n的有序序列为止. 个人见解:也就是先将一个无序的序列对半拆分,将拆分后的序列继续拆分,直到拆分成一个元素为一个序列为止,然后在将两个这样的

HDU 3743 (归并排序模板题)

题意:给定一个序列,然后将此序列按升序排列,每次操作只能交换相邻的两个数,求达到目标所需的最小交换次数:(ps:此题需用 long long ,否则会wa) 当然这其实就是求逆序对数: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. #include<stdio.h> #include<stdlib.h> #include<string.h> #defi

归并排序模板(Java)

import java.util.Scanner; import java.io.BufferedInputStream; class Main{ static int N = (int) 1e5 + 10,len; static int[] q = new int[N],temp = new int[N]; static void mergeSort(int[] q,int l,int r){ if(l>=r) return; int mid=(l+r)>>1; mergeSort(q

ZOJ3574(归并排序求逆数对)

Under Attack II Time Limit: 5 Seconds      Memory Limit: 65536 KB Because of the sucessfully calculation in Under Attack I, Doctor is awarded with Courage Cross and promoted to lieutenant. But the war seems to end in never, now Doctor has a new order

快排+归并+整数二分

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);

算法提高课——图论

图论难点:问题的转化和抽象(可看成特殊的某一类DP) 图论与DP的联系: DP问题(从集合角度分析最优化问题)可以看成从F(0,0).F(0,1).F(1,2)......F(0,m)到F(n,m)的最长路.因此DP问题可以转化为拓扑图(一般DP问题的状态间无环)上的最短(长)路. 当DP依赖关系不具有拓扑序时(即存在环时),可以将其转化为最短路,也可以用高斯消元. //TLE的原因常常是没有memsert //st数组在不同算法中的用法: 单源最短路的建图方式 AcWing 1129. 热浪