36-歸併排序找逆序對

一、問題描述

在數組中的兩個數字如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數

二、解題思路

使用歸併排序實現逆序對的求解

三、解題算法

/************************************************
author:tmw
date:2018-8-4
*************************************************/
#include <stdio.h>
#include <stdlib.h>

/**歸併排序求逆序對
* reverseOrderCount 記錄逆序對個數
**/
//歸併排序:將兩個有序表變成一個有序表
int merge( int* array, int left, int middle, int right )
{
    if( array == NULL || left > right ) return 0;

    /**構建左、右子數組**/
    int left_len = middle - left;
    int right_len  = right - middle - 1;
    int left_array[left_len];
    int right_array[right_len ];
    int i,j;

    //單獨摘出兩個有序序列
    for( i=0; i<=left_len; i++ )
        left_array[i] = array[i+left];
    for( j=0; j<=right_len ; j++)
        right_array[j] = array[j+middle+1];

    /**實現將兩個有序序列變成一個有序序列**/
    i=0; j=0;
    int reverseOrderCount = 0;
    int m = left;
    while( i<=left_len && j<=right_len  )
    {
        if( left_array[i] > right_array[j] )
        {
            array[m++] = right_array[j++];
            reverseOrderCount += j+1;
        }
        else
            array[m++] = left_array[i++];
    }
    while( i<=left_len )
        array[m++] = left_array[i++];
    while( j<=right_len  )
        array[m++] = right_array[j++];
    return reverseOrderCount;
}
void mergeSort( int* array, int left, int right )
{
    if( !array || right < left ) return;
    int reverseCount = 0;

    if( left < right )
    {
        int middle = left + (right-left)/2;
        mergeSort(array,left,middle);
        mergeSort(array,middle+1,right);
        reverseCount = merge(array,left,middle,right);
    }
    printf("reverseCount = %d\n",reverseCount);
}

 

 

                                                                                            夢想還是要有的,萬一實現了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章