zoukankan      html  css  js  c++  java
  • 归并排序

    归并排序求逆序对

             将里面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;
    }



  • 相关阅读:
    day02_05.除数与被除数
    day02_04.算算多少人
    day02_03.五个数字一行输出
    day02_02.能被3整除的个位数为6的数
    day02_01.能被3整除的数
    day05_10 作业
    day05_09 列表内置方法
    day05_08 列表讲解、切片、内置方法
    day05_07 标志位讲解
    day05_06 continue语句、while循环
  • 原文地址:https://www.cnblogs.com/pangblog/p/3241481.html
Copyright © 2011-2022 走看看