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

    归并平排序的思想:例如对a数组排序;

    1:先二分递推至length[a]=1,此时a内元素已排序(只有1个元素嘛。。);

    2:对于区间x~y,递归时合并两个已排序的数组到临时数组t并通过合并过程排好序;

    3:此时临时数组t中元素即a数组中x~y区间元素已排序状态,将其复制到a数组x~y区间,则x~y区间元素已排序;

    对于第2步中的合并排序具体过程如下:

    列如合并区间a[p~m]和a[m~y]到t数组;

    依次比较两个区间中最小的数(此时两个区间已排序),将两个数中更小的移到临时数组t中,直至两个数组全部为空(当其中一个数组为空时直接将另一个数组中剩余的元素全部移到t数组中即可),得到的t数组即两个区间合并排序后的状态;

    代码:

     1 #include <bits/stdc++.h>
     2 #define MAXN 100000+10
     3 using namespace std;
     4 
     5 //************归并排序**************************
     6 
     7 int merge_sort(int* a, int* t, int x, int y){
     8     if(y-x>1){
     9         int m=x+(y-x)/2;     //****二分
    10         int p=x, q=m, i=x;
    11         merge_sort(a, t, p, m);  //***递归左区间
    12         merge_sort(a, t, q, y);  //***递归右区间
    13         while(p<m || q<y){       //***合并到临时数组t
    14             if(q>=y || p<m&&a[p]<a[q]){
    15                 t[i++]=a[p++];
    16             }else{
    17                 t[i++]=a[q++];
    18             }
    19         }
    20         for(int i=x; i<y; i++){    //***将临时数组复制到原数组,此时区间x~y已排序
    21             a[i]=t[i];
    22         }
    23     }
    24 }
    25 
    26 int main(void){
    27     int n, a[MAXN], t[MAXN];
    28     cin >> n;
    29     for(int i=0; i<n; i++){
    30         cin >> a[i];
    31     }
    32     merge_sort(a, t, 0, n);
    33     for(int i=0; i<n; i++){
    34         cout << a[i] << " ";
    35     }
    36     cout << endl;
    37     return 0;
    38 }
  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5953301.html
Copyright © 2011-2022 走看看