`

归并法排序求逆序数

阅读更多

归并排序

归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并操作

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

算法描述

归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

 

归并排序

归并排序具体工作原理如下(假设序列共有n个元素):

  1. 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
  2. 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
  3. 重复步骤2,直到所有元素排序完毕

 

算法复杂度

比较操作的次数介于(n log n)/2n log n - n + 1 赋值操作的次数是(2nlogn)。 归并算法的空间复杂度为:Θ (n)

 

下面贴代码:

 

 

 

#include<stdio.h>
int a1[1000],a2[1000];
int n;
int g(int a,int b,int c)
{
	int i=a,j=b+1,k=a,sum=0;
	while(i<=b&&j<=c)
	{
		if(a1[i]<=a1[j])a2[k++]=a1[i++];
		else{a2[k++]=a1[j++];sum+=j-k;}
	}
	while(i<=b)a2[k++]=a1[i++];
	while(j<=c)a2[k++]=a1[j++];
	for(i=a;i<=c;i++)
		a1[i]=a2[i];
	return(sum);
}
int f(int a=0,int b=n-1)
{
	if(a>=b)return(0);
	int sum=0,mid=(a+b)>>1;
	sum+=f(a,mid);
	sum+=f(mid+1,b);
	sum+=g(a,mid,b);
	return(sum);
}

int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		int i;
		for(i=0;i<n;i++)
			scanf("%d",&a1[i]);
		printf("%d\n",f());
		for(i=0;i<n;i++)
			printf("%d  ",a1[i]);
		putchar(10);
	}
	return(0);
}

 

 

分享到:
评论

相关推荐

    归并排序求逆序数

    ### 归并排序求逆序数 #### 一、引言 在计算机科学与数据结构领域,排序算法是基础且重要的组成部分。其中,归并排序作为一种高效稳定的排序方法,在实际应用中有着广泛的应用场景。本篇文章将围绕如何利用归并...

    利用归并排序求逆序数

    利用归并排序求逆序数,复杂度在O(nlgn)含测试用例

    利用归并排序实现逆序数计算

    利用归并排序实现关于逆序数的计算,Java程序

    归并求逆序对 C语言实现

    本文介绍了一种基于归并排序的方法来计算数组中的逆序对数量。这种方法利用了分治的思想,通过递归将大问题分解为小问题,然后在合并阶段计算逆序对的数量。在 C 语言实现中,使用了辅助数组来存储排序结果,并通过...

    归并求逆序对 分治 递归

    ### 归并求逆序对 分治 递归 ...通过对归并排序求逆序对的方法的学习,我们可以了解到如何巧妙地结合分治策略来解决复杂的问题。这种方法不仅高效而且易于理解,是处理逆序对问题时的首选方案之一。

    POJ1804-Brainman【借助Mergesort求逆序数O(nlogn)】

    **归并排序求逆序数的O(n log n)方法**: 归并排序是一种分治算法,它将大问题分解为小问题来解决。在归并过程中,我们可以顺便计算逆序对。在归并两个已排序的子数组时,比较它们的元素并计算逆序对。这个过程可以...

    求数组的逆序数

    在计算机科学和编程领域,"数组的逆序数"是一个重要的概念,特别是在...例如,在快速排序和归并排序中,逆序数可以用来衡量算法的效率。在实际应用中,当处理大量数据时,有效的逆序数计算算法能够显著提高程序性能。

    采用归并排序方法来计算一个序列的逆序数

    采用归并排序的方法来就算一个序列总的逆序数

    NiXuShu.rar_NiXuShu_逆序数

    本压缩包“NiXuShu.rar_NiXuShu_逆序数”包含了一个使用归并排序算法计算逆序数的实现,名为“归并排序求逆序数”。归并排序是一种稳定的排序算法,其基本思想是将大问题分解为小问题来解决,然后将小问题的解合并...

    算法-求排列的逆序数(信息学奥赛一本通-T1237).rar

    《算法-求排列的逆序数(信息学奥赛一本通-T1237)》这个主题涉及到的是计算机科学中的一个重要概念,逆序对或逆序数,它在算法设计和分析中扮演着关键角色,特别是在解决排序和组合优化问题时。逆序数是衡量一个...

    归并排序,排序等算法,数据结构,快速排序,链表排序

    本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...

    剑指Offer – 面试题51. 数组中的逆序对(归并排序,求逆序对)

    1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的... 计算右侧小于当前元素的个数(二叉查找树&二分查找&归并排序逆序数总结) 方法

    数据结构堆排序 快速排序 归并排序

    本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...

    用以计算某一排序的逆序数,输入可为整型或字符串

    逆序数的计算通常与排序算法如快速排序、归并排序等有关,因为它们可以利用逆序数作为优化策略或理解算法复杂性的工具。对于整数数组,逆序对是指在数组中的一对数字i和j,满足i 但a[i] &gt; a[j]。对于字符串,我们...

    算法相关-求数列逆序数

    这个“算法相关-求数列逆序数”的主题涉及到一个经典的计算机科学问题,即如何有效地计算一个数列中的逆序对数量。逆序对是指在已排序的数列中,如果前面的元素大于后面的元素,那么这两个元素就构成一个逆序对。 ...

    算法-求逆序对(信息学奥赛一本通-T1311).rar

    求解逆序对的核心算法有多种,这里主要介绍两种常见方法:归并排序法和线性时间复杂度的树状数组(也称为斐波那契堆)。 1. **归并排序法**: 归并排序在排序过程中可以自然地统计逆序对。在合并两个有序子数组时...

    排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht

    排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht

    求逆序数对1

    归并排序算法是一种常见的排序算法,也可以用来解决逆序数对问题。该算法的基本思路是将序列分成两个部分,然后对每个部分进行排序,最后将两个部分合并。在合并过程中,可以统计逆序数对的数量。该算法的时间复杂度...

    直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码

    直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...

    快速排序、归并排序、堆排序 并比较排序时间

    快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...

Global site tag (gtag.js) - Google Analytics