計算一組數據的逆序數對的個數(歸併排序)

#include<iostream>
using namespace std;
static int count = 0;
void merge(int *q,int m,int l,int r)
{
	int *larray = new int [m-l+1];
	int *rarray = new int [r-m+1-1];
	for(int z = 0;z != m-l+1;++z)
		larray[z] = q[l+z];//注意q的下標
	for(int z = 0;z != r-m;++z)
		rarray[z] = q[(m+1)+z];//下標
	int i = 0,j = 0;
	for(int k = l;k != r+1;++k)//注意k不從0開始
	{	
		if(i != m-l+1  && j == r-m)
		{
			q[k] = larray[i++];
		}
		else if(i == m-l+1 && j != r-m)
		{
			q[k] = rarray[j++];
		}
		else if(larray[i] > rarray[j])
		{
			q[k] = rarray[j++];
			count += (m-l+1)-i;//計數逆序數對,左邊的大那麼左邊剩下的都比右邊的大
		}
		else
		{
			q[k] = larray[i++];
		}
	}
}
void merge_sort(int *p,int left,int right)
{
	
	if(left < right)//if和while,我當初怎麼就用了while呢????
	{
		int mid = (left+right)/2; 
		merge_sort(p,left,mid);
		merge_sort(p,(mid+1),right);
		merge(p,mid,left,right);
	}
}

int main()
{
	int a[] = {6,5,4,3,2,1};
	int n = (sizeof(a)/sizeof(int))-1;
	merge_sort(a,0,n);
	cout << count << endl;
	return 0;
}
相關文章
相關標籤/搜索