归并排序
归并排序求逆序对
将里面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; }