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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

NYOJ 322 Sort(归并排序求逆序数)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=322 如果按冒泡排序这些O(n^2)肯定会超时,所以需要找一种更快的方法 -------...

hdu 2689 sort it(树状数组 逆序数)

树状数组求逆序数,原来一直没搞明白,今天看了一遍文章讲的很清楚,下面把有关内容粘过来: 对于小数据,可以直接插入树状数组,对于大数据,则需要离散化,所谓离散化,就是将 100 200 300 ...

HDU 5775 Bubble Sort 树状数组求逆序数

题目描述:Problem Description P is a permutation of the integers from 1 to N(index starting from 1). He...

UVALive 6604 Airport Sort 【归并排序】【逆序数】

逆序数

【归并排序】【逆序数】HDU 5775 Bubble Sort

题目链接:   http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意:   冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现...

树状数组 ( 求逆序数 )——Bubble Sort ( HDU 5775 ) ( 2016 Multi-University Training Contest 4 1012 )

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 分析: 给出N个数,将这几个数进行题中所述的“冒泡排序”,求每个数在排序过程中(包括始末状...
  • FeBr2
  • FeBr2
  • 2016-07-28 20:05
  • 147

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

**合并排序**,顾名思义,合并另个子序列。此处一般合并两个已排序的子序列。merge(A,p,q,r)。A是待排序数组,p、q、r是下标,且满足P<=q<r。其中A[p...q]和A[q+1...r...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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