逆序对问题的另一种经典解法:归并排序

转载 2016年05月30日 10:18:40

逆序对问题:
在树状数组的应用中已经对逆序对问题进行了一次解答。
下面说明另一种经典解法:归并排序

#include <iostream>
#include <stdio.h>
using namespace std;

int num[1005];
int temp[1005];
int ans;

int merge_sort(int s, int e)
{
    if(s == e) // 返回
        return 0;
    int m = (s+e)>>1;  // 右移一位,相当于除2
//cout<<m;
    //getchar();
    merge_sort(s,m);
    merge_sort(m+1,e);

    int cnt = 0;
    int i,j;
    for( i = s, j = m+1; i<=m && j <= e; )
    {
        if( num[i] > num[j] )
        {
             temp[cnt++] = num[j];
             j++;
            ans +=  (m-i+1); //更新逆序对的数量
        }
        else
        {
            temp[cnt++] = num[i];
            i++;
        }
    }
    while( i<= m)
    {
        temp[cnt++] = num[i++];
    }
    while(j<= e)
        temp[cnt++] = num[j++];

    for(int c = 0; c<cnt ; c++)
        num[s+c] = temp[c];      //重新幅值回来,得到有序的数组
}
int main(int arg, char** argv)
{
    int n_num;
    cout<<"输入数字的个数:";
    cin>>n_num;
    if(n_num<1)
    {
        cout<< "wrong input !";
        return -1;
    }
    ans = 0;
    cout<< "请输入"<<n_num<<"个数:";
    for(int i = 1 ; i<= n_num ; i++)
    {
        cin>>num[i];
    }
    merge_sort(1,n_num);
    for(int i = 1; i<=n_num; i++)
        cout<< num[i]<<" ";
    cout<<endl<< "逆序对的数量:"<<ans;
    return 0;
}


做了一个搬运工,手打的代码,加深映像!!!
TJU-26E
2016-5-30

【算法】逆序对问题的四种解法(归并排序,BST,树状数组,线段树)及变形

引发我对逆序对这个问题思考的源自这道题:315. Count of Smaller Numbers After Self 以前我以为求一个序列逆序对个数的解法就是归并排序的改版...

算法竞赛入门经典:第八章 高效算法设计 8.3归并排序应用之逆序对数

/* 逆序对数: 给出一列数a1,a2,...,an,求它的逆序对数,即有多少个有序对(i,j),使得iaj。n可以高达10^6 思路: 分解成前后两个序列,统计后序列中每个元素与前面中每个元素的逆...

哈理工OJ 2224 逆序对问题(利用归并排序求逆序数对数)

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2224逆序对问题 Time Limit:...

【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题

#include using namespace std; //二路排序算法,书p17 正确性证明见p18-19 void merge(int *b,int p,int q,int r) ...

归并排序&&数组中逆序对问题

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是{7,5}、{...

归并排序与逆序对问题---(解题报告)POJ1804---Brainman

归并排序,主要是以分治思想进行组合排序,先分再和,在和的过程中排序,排序的思路如下:先给你两组同向有序数组,首先判断两组数的首位的大小,并将较小的数保留到一个新数组中,接下来再比较较小组数的第二位和另...

【java】归并排序 逆序对数

归并排序 按照分治三步法,介绍归并排序步骤: 划分问题:把序列分成元素个数尽量相等的两半; 递归求解:把两半元素分别排序; 合并问题:把两个有序表合并成一个。 前两部分容易完成,关键在于如何...
  • wow_bc
  • wow_bc
  • 2017年04月26日 11:08
  • 206

#1141 : 二分·归并排序之逆序对

题目:二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回、上上回以及上上上回里我们知道Nettle...

【剑指offer】面试题36:数组中的逆序对 - 归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使...

【每日算法】归并排序及其应用(逆序对&合并有序链表)

归并排序是建立在归并操作上的排序算法,是采用分治法(Divide and Conquer)的一个非常典型的应用,它常用来做外排序。若将两个有序表合并成一个有序表,称为二路归并。外排序外排序(Exter...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:逆序对问题的另一种经典解法:归并排序
举报原因:
原因补充:

(最多只允许输入30个字)