一、問題描述
在數組中的兩個數字如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數
二、解題思路
使用歸併排序實現逆序對的求解
三、解題算法
/************************************************
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);
}
夢想還是要有的,萬一實現了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~~~~