题目1:
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
例如在数组{7,5,6,4}中,共存在5组逆序对。
最直观的方法就是直接求解了,依次扫描数组中的各个数字,并将其与其后的数字作比较。
还有一种方法就是,利用分治的思想:
比如数组data = {7, 5, 6, 4};我们可以将data分解,一直分解到每个子数组只有一个元素,然后,一边比较一边归并,如下图所示:
1、先来复习一下归并排序:
#include <iostream>
using namespace std;
void mergeSort(int data[], int head, int tail);
void merge(int data[], int head, int mid, int tail);
int main()
{
//计算逆序对的数组
int data[4] = { 7, 5, 6, 4 };
int len = 4;
mergeSort(data, 0, len - 1);
for (int i = 0; i < 4; ++i)
{
cout << data[i] << ' ';
}
cout << endl;
return 0;
}
void mergeSort(int data[], int head, int tail)
{
if (head < tail)
{
int mid = (head + tail) / 2;
mergeSort(data, head, mid);
mergeSort(data, mid + 1, tail);
merge(data, head, mid, tail);
}
return;
}
voi