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 }
  • 相关阅读:
    Leetcode#145 Binary Tree Postorder Traversal
    Leetcode#146 LRU Cache
    单引号和双引号的区别
    $* $@ $#
    pthread_detach
    pthread_join
    intent 启动activity、service的方法
    multicast based on udp
    ARM指令系统
    ARM寄存器
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13678554.html
Copyright © 2011-2022 走看看