• 归并排序


    归并平排序的思想:例如对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 }
  • 相关阅读:
    项目中看似很难的问题可能很简单
    ASP.NET数据列表“全选”,批量处理的JS实现
    [转]给网站增加如:flv,torrent等特殊后缀格式文件下载
    GD Graphics Library
    在VS2008中编译64位程序以及遇到的问题
    关于C#闭包
    SNMP协议介绍及SNMP library
    ASP.NET MVC 使用总结(二)——扩展HtmlHelper实现动态生成title及meta
    LINQ查询代码整理(一)
    使用方便的SDK帮助文档
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5953301.html
Copyright © 2020-2023  润新知