`
chriszeng87
  • 浏览: 741367 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

归并排序求逆序对的代码(C语言)

阅读更多

#include <stdio.h>
#include <stdlib.h>

#define MAX 32767

int merge(int *array, int p,int q,int r) { 
	//归并array[p...q] 与 array[q+1...r]

	int tempSum=0;
	int n1 = q-p+1;
	int n2 = r-q;
	int* left = NULL;
	int* right = NULL;
	int i,j,k;

	left = ( int *)malloc(sizeof(int) * (n1+1));
	right = ( int *)malloc(sizeof(int) * (n2+1));
	
	for(i=0; i<n1; i++)
		left[i] = array[p+i];

	for(j=0; j<n2; j++)
		right[j] = array[q+1+j];

	left[n1] = MAX; //哨兵,避免检查每一部分是否为空
	right[n2] = MAX;

	i=0;
	j=0;

	for(k=p; k<=r; k++) {
		if( left[i] <= right[j]) {
			array[k] = left[i];
			i++;
		} else {
			array[k] = right[j];
			j++;
			tempSum += n1 - i;
			printf("tempSum = %d\n", tempSum);
		}
	}
	return tempSum;

}

int mergeSort(int *array, int start, int end ) {
	int sum=0;
	if(start < end) {
		int mid = (start + end) /2;
		sum += mergeSort(array, start, mid);
		sum += mergeSort(array, mid+1, end);
		sum += merge(array,start,mid,end);
	}
	return sum;
}

int main(int argc, char** argv) {
	int array[5] = {9,1,0,5,4};
	int inversePairNum;
	int i;

	inversePairNum = mergeSort(array,0,4);
	for( i=0; i<5; i++)
		printf("%d ", array[i]);
	printf("\nInverse pair num = %d\n", inversePairNum);
	return 0;
}
 
分享到:
评论
2 楼 chriszeng87 2011-05-02  
忘了free掉malloc的内存了
    free(left);
    free(right);
    left = NULL;
    right = NULL;
1 楼 chriszeng87 2011-05-01  
    for(k=p; k<=r; k++) { 
        if( left[i] <= right[j]) { 
            array[k] = left[i]; 
            i++; 
        } else { 
            array[k] = right[j]; 
            j++; 
            tempSum += n1 - i; 
            printf("tempSum = %d\n", tempSum); 
        } 
    } 

    这部分是重点,思想是在合并left[0...n1] 和 right[0...n2]时,如果left[i] > right[j] ,则left 数组中第i个元素及后面的元素都将跟 right[j]构成逆序对,所以 tempSum += n1-i;

相关推荐

    归并求逆序对 C语言实现

    ### 归并求逆序对 C语言实现 #### 知识点详解 1. **归并排序算法**:归并排序是一种经典的排序算法,采用分治策略来对数组进行排序。其基本思想是将待排序的数据分成两部分,分别对这两部分数据进行排序,然后再...

    用C实现快速排序、希尔排序、归并排序等排序算法

    本篇将详细探讨快速排序、希尔排序和归并排序这三种在C语言中常见的排序算法。 首先,我们来看快速排序(Quick Sort)。快速排序由C.A.R. Hoare在1960年提出,其基本思想是分治法。它的核心是选择一个基准元素,...

    c语言实现排序算法,快速排序,归并排序

    本文将详细探讨两种常见的高效排序算法——快速排序和归并排序,它们都是C语言实现的重点。 首先,快速排序是一种由C.A.R. Hoare在1960年提出的分治算法。其基本思想是选取一个基准元素,然后将数组分为两部分,一...

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

    因此,在对内存使用敏感且需要稳定性的场景下,归并排序是一个好选择。 在实现中,随机生成1000个0~9的数并用这三种算法排序,可以帮助我们直观理解它们的工作原理和性能差异。通过分析排序后的结果,我们可以比较...

    数据结构试验 排序问题 C语言 源代码

    对于描述中提到的"内部排序",这是相对于外部排序而言的,指的是数据完全在内存中进行排序的过程,常见的内部排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。 1. 冒泡排序:是最简单的...

    逆序对(树状数组) C语言

    逆序对的数量可以反映出数组的有序程度,是许多算法问题的基础,如快速排序、归并排序等的分析。 树状数组,又称为线段树,是一种数据结构,主要用于处理区间查询和区间更新的问题。它的核心思想是将线性数组划分成...

    归并排序、插入排序、归并排序、冒泡排序、选择排序算法的时间比较

    本文将详细探讨五种常见的排序算法——归并排序、插入排序、冒泡排序和选择排序,以及它们在C语言环境下的时间性能比较。 1. **归并排序**: 归并排序是一种基于分治策略的排序算法,它将大问题分解为小问题,再将...

    11087 统计逆序对

    给出的代码示例是一个C语言程序,实现了通过归并排序思想计算逆序对数量的功能。代码中包含以下几个关键部分: 1. **函数`inverse_pair`**:这是核心函数,负责递归地计算逆序对数量。参数`A`表示数组,`x`和`y`...

    用C语言实现常用排序算法

    本项目旨在实现并比较六种经典的排序算法——直接插入排序、折半插入排序、起泡排序、简单选择排序、堆排序以及2-路归并排序,使用C语言编程。为了全面评估这些算法,我们将在一组随机生成的30000个整数上运行它们,...

    统计数组中逆序对

    统计数组中的逆序对的个数,基于归并排序的思想,先拆分为单个元素,再合并为两个元素的数组,组内统计后,排序,进行组建统计

    C语言 实现归并排序算法

    在C语言中实现归并排序,我们需要理解算法的基本原理和步骤。 1. **算法原理**: 归并排序将待排序的序列分成两个子序列,分别对这两个子序列进行排序,然后将两个已排序的子序列合并成一个完整的有序序列。这个...

    c语言实现的各种排序算法效率分析与比较及源代码

    各种排序算法效率分析比较及源...起泡排序,快速排序,归并排序;简单选择排序,树形选择排序和堆排序。 通过输入不同的数据量和数据大小正序,逆序和乱序情况比较各种排序算法的效率。 其中树形选择排序算法有点错误。

    排序算法源代码(C语言实现)

    这些C语言实现的排序算法源代码可以帮助开发者理解每种算法的工作原理,并在实际项目中灵活选择和应用。在优化算法性能、理解复杂度分析以及提升编程能力方面,深入研究这些排序算法都是非常有益的。

    各种常用排序算法的C语言实现

    归并排序同样基于分治思想,将数组分成两半,分别排序后再合并。C语言实现时,可以使用递归和动态分配内存来处理数组的分割与合并。归并排序的时间复杂度始终为O(n log n),但需要额外的O(n)空间。 6. 堆排序(Heap...

    八大排序算法C语言

    5. **归并排序**:归并排序同样采用分治策略,将数组分为两个子数组,分别排序后再合并,保证了稳定的排序效果。其时间复杂度始终为O(n log n),但需要额外的存储空间。 6. **堆排序**:堆排序利用了堆这种数据结构...

    C/C++数据结构_随机10000个数:排序~8大排序代码集.rar

    归并排序也是基于分治策略,将数组递归地分成两半,分别排序,然后合并。其时间复杂度始终为O(n log n),但需要额外的O(n)空间。 7. **堆排序(Heap Sort)**: 堆排序利用了完全二叉树的特性,通过构建最大堆或...

    数据结构_C语言_严蔚敏_排序

    1. **MergeSort.c**:归并排序是一种分治策略的排序方法。它将大数组拆分成小数组,对每个小数组进行排序,然后合并已排序的小数组,形成最终的有序序列。归并排序具有稳定的排序性能,时间复杂度为O(nlogn)。 2. *...

    100个数随机排序_C语言_数据结构_

    这个项目“100个数随机排序”聚焦于数据结构和算法,特别是几种经典的排序方法:直接插入排序、希尔排序、快速排序和归并排序。下面我们将深入探讨这些排序算法以及它们在实际中的应用。 首先,直接插入排序是一种...

    逆序对实现

    2. 归并排序法:利用归并排序的过程可以同时统计逆序对,时间复杂度为O(n log n)。 3. 哈希映射法:利用哈希表记录每个元素出现的次数,然后遍历数组计算逆序对,时间复杂度为O(n)。 4. 差分数组法:通过差分数组...

    求数组的逆序数

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

Global site tag (gtag.js) - Google Analytics