归并排序

归并排序求逆序对

         将里面reverseCount删除就可以作为归并排序代码。归并排序是稳定的。

#include <iostream>

using namespace std;

#define MAX_VALUE 0X7FFFFFFF

int Merge(int arr[],int start,int mid,int high)
{
	int i = start;
	int j = mid + 1;
	int k = start;
    int reverseCount = 0;
	int *temp = new int[high+1];

    while(i<=mid&&j<=high){
		if(arr[i]<=arr[j]){
			temp[k++] = arr[i++];
		}else{
			temp[k++] = arr[j];
			reverseCount += mid - i + 1;
// 			for(int w=i;w<=mid;w++){
// 				cout<<"("<<arr[w]<<","<<arr[j]<<")"<<endl;
// 			}
			j++;
		}
	}
	while(i<=mid)temp[k++] = arr[i++];
	while(j<=high)temp[k++] = arr[j++];

	for(int i=start;i<=high;++i){
		arr[i] = temp[i];
	}

	delete[] temp;

	return reverseCount;
}

int Merge1(int arr[],int low,int mid,int high)
{
	int num1 = mid - low + 1;
	int num2 = high - mid;

	int *temp1 = new int[num1+1];
	int *temp2 = new int[num2+1];

	int reverseCount = 0;

	for(int i=0;i<num1;++i)temp1[i] = arr[i+low];
	temp1[num1] = MAX_VALUE;//哨兵节点
	for(int i=0;i<num2;++i)temp2[i] = arr[i+mid + 1];
	temp2[num2] = MAX_VALUE;//哨兵节点

	int index1 = 0;
	int index2 = 0;

	for(int k=low;k<=high;k++){//直到high,滤除哨兵节点
		if(temp1[index1] <= temp2[index2]){
			arr[k] = temp1[index1++];
		}else{
			arr[k] = temp2[index2++];
			reverseCount += num1 - index1;
		}
	}

	delete[] temp1;
	delete[] temp2;

	return reverseCount;

}

int MergeSort(int arr[],int start,int end)
{
	int reverseCount = 0;
	if(start<end){
   	    int mid = start + (end - start>>1);
		//左子数组逆序对
		reverseCount += MergeSort(arr,start,mid);
		//右子数组逆序对
		reverseCount += MergeSort(arr,mid+1,end);
		//数组与数组之间的逆序对
		reverseCount += Merge(arr,start,mid,end);
	}
	return reverseCount;
}

int main()
{
	int arr[]={1,3,1,8,2,4,6,5};
	for(int i=0;i<8;i++){
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	cout<<"The reverse count:"<<MergeSort(arr,0,7)<<endl;
	for(int i=0;i<8;i++){
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	system("pause");
	return 0;
}



原文地址:https://www.cnblogs.com/pangblog/p/3241481.html