#include <iostream>
#include <stack>
using namespace std;
//
// dfs.h
// dfs
//
// Created by 吴珝君 on 2018/12/25.
// Copyright © 2018年 闲着也是贤者. All rights reserved.
//
/************************************************************************/
/* 小和问题
在一个数组中,每一个数左边比当前数小的数加起来,叫做这个数组的小和,求一个数组的小和。
*/
/************************************************************************/
/************************************************************************/
/* 换句话话说,就是找这个数的右边有多少个数比当前的数大 并进行统计 */
/************************************************************************/
//图的存储--邻接表
#define MAXSIZE 100
#define INF 65535
int merge(int *arr,int low,int mid,int high)
{
int *help = new int[high - low +1];
int res =0;
int L = low;
int R =mid +1;
int index =0;
while(L<=mid&&R<=high)
{
if (arr[L]<arr[R])
{
res+= (high -R+1)*arr[L];//计算arr[R]右边包括arr[R]有多少个数比arr[R7]大
help[index] = arr[L];
L++;
index++;
}
else
{
help[index] = arr[R];
index++;
R++;
}
}
while(L<=mid)
{
help[index++] = arr[L++];
}
while(R<=high)
{
help[index++] = arr[R++];
}
for (int i =0;i<index;i++)
{
arr[low+i] = help[i];
}
return res;
}
int MergeSort(int *arr, int low,int high)
{
if (low==high)
{
return 0;
}
int mid = low +((high-low)>>1);
return MergeSort(arr,low,mid)+MergeSort(arr,mid+1,high)+merge(arr,low,mid,high);
}
//
int rightMethod(int *arr,int length)
{
int res =0;
for (int i= 0;i< length;i++)
{
for (int j =i+1;j<length;j++)
{
if (arr[i]<arr[j])
{
res+=arr[i];
}
}
}
return res;
}
int main()
{
int arr[7] ={1,3,4,2,5,6,7};
cout<<rightMethod(arr,7)<<endl;
cout<<MergeSort(arr,0,6)<<endl;
system("pause");
return 0;
}
#include <iostream>
#include <stack>
using namespace std;
//
// recursive.h
// recursive
//
// Created by 吴珝君 on 2018/12/25.
// Copyright © 2018年 闲着也是贤者. All rights reserved.
//
/************************************************************************/
/* 逆序对问题 在一个数组中,左边的数如果比右边的数大,则折两个数构成一个逆序对,请打印所有逆序 对*/
/************************************************************************/
//图的存储--邻接表
#define MAXSIZE 100
#define INF 65535
int merge(int *arr,int low,int mid,int high)
{
int *help = new int[high - low +1];
int res =0;
int L = low;
int R =mid +1;
int index =0;
while(L<=mid&&R<=high)
{
if (arr[L]>arr[R])
{
for (int i =R;i<=high;i++)
{
cout<<arr[L]<<" "<<arr[i]<<endl;
}
help[index] = arr[L];
L++;
index++;
}
else
{
help[index] = arr[R];
index++;
R++;
}
}
while(L<=mid)
{
help[index++] = arr[L++];
}
while(R<=high)
{
help[index++] = arr[R++];
}
for (int i =0;i<index;i++)
{
arr[low+i] = help[i];
}
return res;
}
int MergeSort(int *arr, int low,int high)
{
if (low==high)
{
return 0;
}
int mid = low +((high-low)>>1);
return MergeSort(arr,low,mid)+MergeSort(arr,mid+1,high)+merge(arr,low,mid,high);
}
//
int rightMethod(int *arr,int length)
{
int res =0;
for (int i= 0;i< length;i++)
{
for (int j =i+1;j<length;j++)
{
if (arr[i]>arr[j])
{
//res+=arr[i];
cout<<arr[i]<<" "<<arr[j]<<endl;
}
}
}
return res;
}
int main()
{
int arr[7] ={5,6,7,1,2,3,4};
rightMethod(arr,7);
MergeSort(arr,0,6);
system("pause");
return 0;
}