Merge Sort 并且返回逆序数的算法 - C#实现

原创 2007年09月25日 11:36:00
针对算法导论第二章的 Problem 2-4的C#实现:
public static Int32 MergeSort(Int32[] InputArray)
...{
    
// Divide: Divide the n-element sequence to be sorted into two subsequences of n/2 elements each.
    Int32 Length = InputArray.Length;
    
if (Length < 2return 0;

    Int32 invCnt 
= 0// Inversion number

    Int32 middle 
= Length / 2;

    Int32 lIdx 
= 0;
    Int32[] lArray 
= new Int32[middle];
    Array.Copy(InputArray, 
0, lArray, 0, lArray.Length);

    Int32 rIdx 
= 0;
    Int32[] rArray 
= new Int32[Length - middle];
    Array.Copy(InputArray, middle, rArray, 
0, rArray.Length);
        
    
// Conquer: Sort the two subsequences recursively using merge sort.
    if (lArray.Length >= 2) invCnt += MergeSort(lArray);
    
if (rArray.Length >= 2) invCnt += MergeSort(rArray);
    
    
// Combine: Merge the two sorted subsequences to produce the sorted answer.
    lIdx = rIdx = 0;
    Int32 mergeIdx 
= 0;
    
while(mergeIdx < InputArray.Length &&  lIdx < lArray.Length && rIdx < rArray.Length )
    
...{
        
if (lArray[lIdx] <= rArray[rIdx]) InputArray[mergeIdx++= lArray[lIdx++];
        
else
        
...{
            invCnt 
+= lArray.Length - lIdx;
            InputArray[mergeIdx
++= rArray[rIdx++];
        }

    }


    
while(lIdx < lArray.Length) InputArray[mergeIdx++= lArray[lIdx++];
    
while(rIdx < rArray.Length) InputArray[mergeIdx++= rArray[rIdx++];

    
return invCnt;
}

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

  • 2011年07月31日 00:10
  • 7KB
  • 下载

算法导论2.4 合并排序求逆序数

2-4 逆序对     设A[1...n]是一个包含n个不同数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对。     (1)列出数组{2,3,8,6,1}的五个逆序。     (...
  • blackfrog_unique
  • blackfrog_unique
  • 2014年11月27日 20:30
  • 590

逆序数个数 (Inversion Counting) - Merge and Sort

普林斯顿的算法课质量很赞,这次作业中涉及到一个"逆序数"的知识,正好在之前学习mergesort时有一道课后提供的面试题与之相关,于是试着实现了。 原题链接:http://www.practice....
  • Jason_Ranger
  • Jason_Ranger
  • 2016年09月22日 00:07
  • 823

归并排序(Merge Sort)+计算数列逆序数

首先是这个算法的基本过程和思想:就是先把一个数列分成两部分,再接着把分成两部分的数列分别再分成两部分,直到分到不能再次分为止,也就是一个数列里面只有一个数的时候。最后我们把它们两两合并,在合并的时候,...
  • I_Like_Algorithms
  • I_Like_Algorithms
  • 2017年03月25日 22:18
  • 240

排序算法详解【归并排序-Merge_Sort】

归并排序详解
  • linsheng9731
  • linsheng9731
  • 2014年04月04日 13:42
  • 9042

算法导论第2章(2) merge 排序

合并排序 (merge sort) Merge排序的思想 合并排序是“分治法”的一个例子,它的主要思想就是:分解问题到若干个更小规模的问题,解决这些小规模问题,然后把小规模的问题合并,得到大规模问...
  • skywalkerVVV
  • skywalkerVVV
  • 2013年01月25日 12:52
  • 2599

普通表的Join 三种算法(join 一) 嵌套循环Join(Nested Loops Join)、排序合并Join(Sort-Merge Join)和哈希Join(Hash Join)

refer to http://mysun.iteye.com/blog/1748473 通过Map-Reduce实现Join系列之一 本系列的开篇在提到使用Map-Reduce实现Join之前,...
  • G7N3F
  • G7N3F
  • 2016年01月18日 16:58
  • 1816

归并排序(Mergesort)之Java实现

归并排序算法介绍 归并排序是一个分治算法(Divide and Conquer)的一个典型实例,把一个数组分为两个大小相近(最多差一个)的子数组,分别把子数组都排好序之后通过归并(Merge)手法合成...
  • kimylrong
  • kimylrong
  • 2013年12月04日 22:19
  • 12445

归并排序(merge sort)的实现

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的一...
  • jkhere
  • jkhere
  • 2013年06月07日 16:02
  • 2264

算法分析之合并排序——merge sort子函数实现

**合并排序**,顾名思义,合并另个子序列。此处一般合并两个已排序的子序列。merge(A,p,q,r)。A是待排序数组,p、q、r是下标,且满足P...
  • koudan567
  • koudan567
  • 2016年04月05日 22:07
  • 1230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Merge Sort 并且返回逆序数的算法 - C#实现
举报原因:
原因补充:

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