博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构练习(44)数列的逆序数对
阅读量:4685 次
发布时间:2019-06-09

本文共 1152 字,大约阅读时间需要 3 分钟。

题目:

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。

如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。

思路:

这一题是算法导论上面的一个课后题,也是微软的一个面试题。

据说可以用线段树来解决这个问题,但是自己在这方面比较薄弱,数据结构的各种知识还有待于加强啊。

可以用mergesort来解决这题:

整体思路还是分治,并且巧妙的用到了mergesort排序过程中的性质,十分值得学习。

int g_pair = 0;void mergearray(int a[], int b[], unsigned beg, unsigned mid, unsigned end){    if (a == NULL || b == NULL || beg > mid || mid + 1 > end)        return;    int i = beg, j = mid + 1;    int n = mid, m = end;    int k = beg;    while (i <= n && j <= m)    {        if (a[i] <= a[j])            b[k++] = a[i++];        else            b[k++] = a[j++], g_pair += n - i + 1;    }    while (i <= n)        b[k++] = a[i++];    while (j <= m)        b[k++] = a[j++];    while (beg <= end)        a[beg] = b[beg], ++beg;}void mergesort(int a[], int b[], unsigned beg, unsigned end){    if (a == NULL || b == NULL || beg >= end)        return;    unsigned mid = beg + (end - beg) / 2;    mergesort(a, b, beg, mid);    mergesort(a, b, mid + 1, end);    mergearray(a, b, beg, mid, end);}

 

转载于:https://www.cnblogs.com/kedebug/archive/2012/12/22/2829473.html

你可能感兴趣的文章
android多层树形结构列表学习笔记
查看>>
koa2实现对mysql的增删改查函数封装
查看>>
自我介绍
查看>>
Android_去掉EditText控件周围橙色高亮区域
查看>>
fedora 29 桌面版 设置 cockpit 自动开机启动
查看>>
分类算法之朴素贝叶斯——简单天气预报算法
查看>>
产品 线上 保持 和 支持 服务 (Support and maintenance solutions)
查看>>
如何优雅的研究 RGSS3 (七) 加入LOGO屏幕
查看>>
POJ3187 Backward Digit Sums
查看>>
高频总线上的串阻问题
查看>>
Cookie/Session机制具体解释
查看>>
Android中Context具体解释 ---- 你所不知道的Context
查看>>
Windows8和MacOS10.9双系统安装及Mac经常使用软件安装--联想E49A
查看>>
轻松自动化---selenium-webdriver(python) (四)
查看>>
mmap内存映射
查看>>
Javascript - ERR_CONTENT_LENGTH_MISMATCH
查看>>
开启迅盘:ReadyBoost和ReadyDrive的开启方法
查看>>
Day25.2 类中的方法
查看>>
Linux 2.6 字符设备驱动程序
查看>>
返回一个二维数组中最大子数组的和
查看>>