一、问题描述
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数
二、解题思路
使用归并排序实现逆序对的求解
三、解题算法
/************************************************
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);
}
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~~~~