zoukankan      html  css  js  c++  java
  • acwing787. 归并排序

    给定你一个长度为 n 的整数数列。
    请你使用归并排序对这个数列按照从小到大进行排序。
    并将排好序的数列按顺序输出。

    输入格式

    输入共两行,第一行包含整数 n。
    第二行包含 n 个整数(所有整数均在 1∼10^9 范围内),表示整个数列。

    输出格式

    输出共一行,包含 n 个整数,表示排好序的数列。

    数据范围

    1≤n≤100000

    输入样例:

    5
    3 1 2 4 5
    

    输出样例:

    1 2 3 4 5
    

    方法一:

    归并排序模板题,注意边界问题

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int nums[100010];
    int buf[100010];
    
    void merge(int low, int high, int mid) {
        if (low >= high) return;
        for (int i = low; i <= high; i++) buf[i] = nums[i];
        int i = low, j = mid+1, k = low;
        while (i <= mid && j <= high) {
            if (buf[i] > buf[j]) nums[k++] = buf[j++];
            else nums[k++] = buf[i++];
        }
        while (i <= mid) nums[k++] = buf[i++];
        while (j <= high) nums[k++] = buf[j++];
    }
    
    void merge_sort(int low, int high) {
        if (low >= high) return;
        int mid = (low + high) >> 1;
        // 这里若划分[low,mid-1]和[mid,high],当mid=0,high=1时,因(0+1)>>1=0导致第二个merge_sort无限递归
        merge_sort(low, mid);
        merge_sort(mid+1, high);
        merge(low, high, mid);
    }
    
    int main() {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &nums[i]);
    
        merge_sort(0, n-1);
    
        for (int i = 0; i < n; i++)
            printf("%d ", nums[i]);
    }
    
  • 相关阅读:
    多线程下载
    jsoup 的简单应用
    DBUtils基本使用
    BeanUtils简单应用
    POI 生成exel报表
    java使用iText生成pdf表格
    solr开发 小案例
    iOS collectionView返回顶部 / 滚动到指定位置
    OC block
    OC 添加GCD 定时器
  • 原文地址:https://www.cnblogs.com/nosae/p/15809190.html
Copyright © 2011-2022 走看看