1: 遍历,只要前面的值大于后面的一个值,就加1;
2 : 冒泡排序,交换一次,就+1;
3: 归并排序:
#include <iostream>
#include <vector>
using namespace std;
class solution
{
public:
//暴力,遍历
int Inverspairs(vector<int> array) {
int all = array.size();
if (all == 0 || all < 2){
return 0;
}
int number = 0;
for (int i = 0; i < all; i++) {
for (int j = i + 1; j < all; j++) {
if (array[i] > array[j]) {
number = number + 1;//前值大就+1
}
}
}
return number;
}
//冒泡排序,交换即一个逆序对
int Inverspairs2(vector<int> element) {
if (element.size() == 0 || element.size() < 2){
return 0;
}
return bubble_sort(element);
}
int bubble_sort(vector<int> array) {
int all = array.size();
int count = 0;
if (array.empty() != 0 || all <2){//all == 0
return 0;
}
for (int end = all -1; end > 0; end--)//end--
for (int i = 0 ; i < end ; i++ ){
if ( array[i] > array[i+1] ) {//前面大于后面的就交换
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
count++;
}
}
for(int i=0; i < array.size(); ++i) {
cout << array[i] << endl;
}
return count;
}
//归并逆序对
int InversPairs3(vector<int> elem) {
if (elem.size() == 0) {
return 0;
}
vector<int> temp(elem.size());//创建一个空数组,有初始化
int count = InversPairs3Score(elem, 0, elem.size() - 1, temp);//调用统计
return count;
}
int MergeElem(vector<int> &elem, int start, int mid, int end, vector<int> &temp){
//传引用,改变实参
int i = mid;//两个数组归并
int j = end;
int k = 0;
int count = 0;
while (i >= start && j > mid) {
if (elem[i] > elem[j]) {
temp[k++] = elem[i--];//大的排前边
count += j - (mid+1) + 1;//大就统计
}
else {
temp[k++] = elem[j--];
}
}
cout << "count = " << count << endl;
while (i >= start){
temp[k++] = elem[i--];
}
while (j > mid) {
temp[k++] = elem[j--];
}
// temp 从大往小的顺序
for (int i = 0; i < k; i++) {
elem[end - i] = temp[i];
}
//copy(elem.begin(), elem.end(), ostream_iterator<int>(cout," "));
for (int i = 0; i < elem.size(); i++)
{
cout << elem[i] << endl;
}
return count;
}
int InversPairs3Score(vector<int> &elem, int start, int end, vector<int> &temp) {
//&传引用,改变实参
int inversions = 0;
if (start < end) {
int mid = (start + end)/2;
inversions += InversPairs3Score(elem, start, mid, temp);//左部分
inversions += InversPairs3Score(elem, mid+1, end, temp);//右部分
inversions += MergeElem(elem, start, mid, end, temp);//实参
}
return inversions;
}
};
int main()
{
int a1[] = { 6, 5, 4 , 7, 2, 3, 4};
vector<int> vec(a1, a1+7);
solution s;
//cout << s.Inverspairs(vec) << endl;
//cout << s.Inverspairs2(vec) << endl;
cout << s.InversPairs3(vec) << endl;
return 0;
}