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

    题目描述

    给定你一个长度为n的整数数列。

    请你使用归并排序对这个数列按照从小到大进行排序。

    并将排好序的数列按顺序输出。

    输入格式

    输入共两行,第一行包含整数 n。

    第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。

    输出格式

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

    数据范围

    1≤n≤100000

    输入样例:

    5
    3 1 2 4 5

    输出样例:

    1 2 3 4 5

    算法描述

    归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法采用分治法.

    将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    归并操作的工作原理如下:

    第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

    第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

    第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

    重复步骤3直到某一指针超出序列尾

    将另一序列剩下的所有元素直接复制到合并序列尾

    (以上算法描述来自百度百科)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 using namespace std;
     5 const int max_n=1e5+5;
     6 
     7 int a[max_n], b[max_n];
     8 
     9 void mergeSort(int l, int r) {
    10     if(l>=r) return;
    11     int mid=l+r >> 1;
    12     mergeSort(l, mid);
    13     mergeSort(mid+1, r);
    14     int p1=l, p2=mid+1, cnt=l;
    15     while(p1<=mid && p2<=r) {
    16         if(a[p1]<=a[p2]) b[cnt++]=a[p1++];
    17         else b[cnt++]=a[p2++];
    18     }
    19     while(p1<=mid) b[cnt++]=a[p1++];
    20     while(p2<=r) b[cnt++]=a[p2++];
    21     for(int i=l; i<=r; i++) 
    22         a[i]=b[i];
    23 }
    24 
    25 int main() {
    26     int n;
    27     cin>>n;
    28     for(int i=0; i<n; i++) cin>>a[i];
    29     mergeSort(0, n-1);
    30     for(int i=0; i<n; i++) cout<<a[i]<<' ';
    31     return 0;
    32 }
  • 相关阅读:
    UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
    UVa 1658 (拆点法 最小费用流) Admiral
    UVa 11082 (网络流建模) Matrix Decompressing
    UVa 753 (二分图最大匹配) A Plug for UNIX
    UVa 1451 (数形结合 单调栈) Average
    UVa 1471 (LIS变形) Defense Lines
    UVa 11572 (滑动窗口) Unique Snowflakes
    UVa 1606 (极角排序) Amphiphilic Carbon Molecules
    UVa 11054 Wine trading in Gergovia
    UVa 140 (枚举排列) Bandwidth
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13678554.html
Copyright © 2011-2022 走看看