设A[0 .. n - 1]是一个包含n个不同数的数组。如果在i < j的情况下,有A[i] > A[j],则(i, j)就称为A中的一个逆序对
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
2
名称:逆序数(归并排序)
3
*/
4
#include <iostream>
5
#include <time.h>
6
#include <stdlib.h>
7
using namespace std;
8
int inverseNumber;
9
void mergeSort(int*, int);
10
void __mergeSort(int*, int, int);
11
void merge(int*, int, int, int);
12
int main(void)
13![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
14
int n;
15
int *array;
16![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
srand(time(NULL)); /**//*void srand(unsigned seed);*/
17
while (true)
18![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
19
cin >> n;
20
array = new int[n];
21![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*随机生成数组*/
22
for (int i = 0; i < n; ++i)
23![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
24![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
array[i] = rand() % 100; /**//*int rand(void);*/
25
}
26![](/Images/OutliningIndicators/InBlock.gif)
27![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*排序前*/
28
for (int i = 0; i < n; ++i)
29![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30
cout << array[i] << ' ';
31
}
32
cout << endl;
33![](/Images/OutliningIndicators/InBlock.gif)
34![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*初始化为0*/
35
inverseNumber = 0;
36![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*归并排序*/
37
mergeSort(array, n);
38
cout << inverseNumber << endl;
39![](/Images/OutliningIndicators/InBlock.gif)
40
delete array;
41
}
42
return 0;
43
}
44
void mergeSort(int* array, int length)
45![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
46
__mergeSort(array, 0, length - 1);
47
}
48
void __mergeSort(int* array, int first, int last)
49![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
50![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*只有有两个元素*/
51
if (first < last)
52![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
53
int middle = first + (last - first) / 2;
54
__mergeSort(array, first, middle);
55
__mergeSort(array, middle + 1, last);
56
merge(array, first, middle, last);
57
}
58
}
59
void merge(int* array, int first, int middle, int last)
60![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
61
int* temp = new int[last - first + 1];
62
int i = first;
63
int j = middle + 1;
64
int k = 0;
65
while (i <= middle && j <= last)
66![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
67![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*取较小者*/
68
if (array[i] <= array[j])
69![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
70
temp[k] = array[i];
71
++i;
72
}
73
else
74![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
75
temp[k] = array[j];
76
++j;
77
inverseNumber += middle - (i - 1);
78
}
79
++k;
80
}
81![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*前半部分没有复制完*/
82
if (i <= middle)
83![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
84
while (i <= middle)
85![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
86
temp[k] = array[i];
87
++i;
88
++k;
89
}
90
}
91![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*后半部分没有复制完*/
92
if (j <= last)
93![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
94
while (j <= last)
95![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
96
temp[k] = array[j];
97
++j;
98
++k;
99
}
100
}
101![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*复制回原数组*/
102
for (int p = first, q = 0; p <= last; ++p, ++ q)
103![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
104
array[p] = temp[q];
105
}
106![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*释放内存*/
107
delete temp;
108
}
posted on 2012-10-22 22:38
zhuxin 阅读(124)
评论(0) 编辑 收藏 引用 所属分类:
数学