#include <bits/stdc++.h>
using namespace std;
/*
查找排列的逆序数
*/
//MergesortandCut
void MergeandCut(int a[],int L, int mid,int R){
int* temp = new int[R - L + 1];
int i = L;
int j = mid + 1;
int t = 0;
//同等长度的纳入完成
while( i <= mid && j <= R){
if(a[i] > a[j])
temp[t++] = a[j++];
else
temp[t++] = a[i++];
}
//[L,mid]内还没有遍历的纳入
while(i <= mid)
temp[t++] = a[i++];
//[mid+1,R]内还没有遍历的纳入
while(j<=R)
temp[t++] = a[j++];
//将归并后的数组变为原来的数组
for(int k = 0; k <= R - L; k++)
a[L+k] = temp[k];
delete temp;
}
void mergesort(int a[], int L,int R){
if(L < R){
//分左右两个区间
int mid = L + (R - L ) / 2;
//对[L,mid]区间进行一直切割 知道切割到只有一个元素为一组 区间一直折半
mergesort(a, L,mid);
//对[mid+1,R]区间进行一直切割 知道切割到只有一个元素为一组 区间一直折半
mergesort(a, mid+1,R);
//分组直到都是最小的模块的时候 进行合并
MergeandCut(a,L,mid,R);
}
}
int main()
{
int a[] = {8,3,4,1,2};
mergesort(a,0,4);
for(int i = 0; i < 5; i++)
printf(" %d",a[i]);
return 0;
}
归并排序 C++
最新推荐文章于 2024-05-10 20:12:33 发布