经典算法(9) 从归并排序到数列的逆序数对(微软笔试题)

首先来看看原题

微软2010年笔试题

在一个排列中,如果一对数的前后位置与大小顺序相反 ,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序 数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定 一数组,要求统计出该数组的逆序数对个数。

计算数列的逆序数对个数最简单的方便就最从前向后依 次统计每个数字与它后面的数字是否能组成逆序数对。代码如下:

#include <stdio.h>
int main()
{
    printf("     数列的逆序数对 \n");
    printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");      

    const int MAXN = 8;
    int a[MAXN] = {1, 7, 2, 9, 6, 4, 5, 3};  

    int nCount = 0;
    int i, j;
    for (i = 0; i < MAXN; i++)
        for (j = i + 1; j < MAXN; j++)
            if (a[i] > a[j])
                nCount++;  

    printf("逆序数对为: %d\n", nCount);
}

运行结果如下:

这种方法用到了双循环,时间复杂度为O(N^2),是一个不太优雅的方法。因此我们尝试用其它方法来解决 。

在《白话经典算法系列之五归并排序的实现》中观察归并排序——合并数列(1,3,5)与(2,4)的 时候:

1.先取出前面数列中的1。

2.然后取出后面数列中的2,明显!这个2和前面的3,5都 可以组成逆序数对即3和2,5和2都是逆序数对。

3.然后取出前面数列中的3。

4.然后取出后 面数列中的4,同理,可知这个4和前面数列中的5可以组成一个逆序数对。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, fibonacci数列
, java 笔试题
, 前面
, 笔试题
, 个数
, 算法 最大子数列
, 一个
, 逆序环视
, 逆序
, 归并方法
, 逆序arraylist
, 递减数列
数列
归并排序求逆序数、归并排序 逆序数、归并求逆序数、归并 逆序数、归并排序,以便于您获取更多的相关知识。

时间: 2024-10-30 09:50:55

经典算法(9) 从归并排序到数列的逆序数对(微软笔试题)的相关文章

经典算法(5) 归并排序的实现

归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一 个非常典型的应用. 首先考虑下如何将将二个有序数列合并.这个非常简单,只要从比较二个数列的 第一个数,谁小就先取谁,取了后就在对应数列中删除这个数.然后再进行比较,如果有数列为空,那直接 将另一个数列的数据依次取出即可. //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]) { i

PHP经典算法集锦【经典收藏】_php技巧

本文实例总结了PHP经典算法.分享给大家供大家参考,具体如下: 1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++){ echo str_repeat(" ",3-$i); echo str_repeat("*",$i*2+1); echo '<br/>'; } 2.冒泡排序,C里基础算法,从小到大对一组数

经典算法(8) MoreWindows白话经典算法之七大排序总结篇

在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种 常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载.下载地址为: http://download.csdn.net/detail/morewindows/4443208. 有网友提议到 这本<MoreWindows白话经典算法之七大排序>电子书讲解细致用来平时学习是非常好的,但是页数有22页, 不太合适做面试前的复习资料.因此在这里将这七种常用的排序方法进行下总结,以便大家更好的复习这些 经典

经典算法:基数排序的小例子_实用技巧

1.概述 基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数.基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献. 原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后,

【算法】PHP实现经典算法(上)

前言 下面的是通过PHP实现经典算法,并计算了耗时,可以通过耗时对比这几种算法的复杂度. 插入排序 冒泡排序 选择排序 并归排序 快速排序 CODE $arr = []; for ($i = 0; $i < 5000; $i++) { $arr[] = rand(1, 10000); } //1 插入排序 function insertionSort($arr) { for ($i = 1; $i < count($arr); $i++) { $tmp = $arr[$i]; //设置监视哨

经典算法题每日演练——第十题 树状数组

原文:经典算法题每日演练--第十题 树状数组         有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序      假如我现在有个需求,就是要频繁的求数组的前n项和,并且存在着数组中某些数字的频繁修改,那么我们该如何实现这样的需求?当然大家可以往 真实项目上靠一靠. ① 传统方法:根据索引修改为O(1),但是求前n项和为O(n). ②空间换时间方法:我开一个数组sum[],sum[i]=a[1]+..

javascript常用经典算法实例详解_javascript技巧

本文实例讲述了javascript常用算法.分享给大家供大家参考,具体如下: 入门级算法-线性查找-时间复杂度O(n)--相当于算法界中的HelloWorld //线性搜索(入门HelloWorld) //A为数组,x为要搜索的值 function linearSearch(A, x) { for (var i = 0; i < A.length; i++) { if (A[i] == x) { return i; } } return -1; } 二分查找(又称折半查找) - 适用于已排好序的

数据挖掘十大经典算法(详解)

数据挖掘十大经典算法  一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:  1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足:  2) 在树构造过程中进行剪枝:  3) 能够完成对连续属性的离散化处理:  4) 能够对不完整数据进行处理.  C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据

数据结构经典算法

C#选择排序 using System:namespace SelectionSorter{ public class SelectionSorter{ private int min:public void Sort(int [] list){ for(int i=0:i<list.Length-1:i++){ min=i:for(int j=i+1:j<list.Length:j++){ if(list[j]<list[min])min=j:}int t=list[min]:list