归并排序:就是给你组数,相邻的分成一组一组的,之后在每组内排序,使其形成有序的数列,之后再把每相邻的两组合成一个组,之后再排序。
刚开始学的时候就知道原理,就是不太明白递归调用堆栈的过程,但是随着学习的不断深入慢慢的好像理解了整个的过程,下边,贴一个代码,
这个代码是根据别人代码修改来的,先看下图,理解下思路;
#include <stdlib.h>
#include <stdio.h>
#include<time.h>
void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex)//合并
{
int i = startIndex, j=midIndex+1, k = startIndex;
while(i!=midIndex+1 && j!=endIndex+1)
{
if(sourceArr[i] > sourceArr[j])
tempArr[k++] = sourceArr[j++];
else
tempArr[k++] = sourceArr[i++];
}
while(i != midIndex+1)//
tempArr[k++] = sourceArr[i++];
while(j != endIndex+1)
tempArr[k++] = sourceArr[j++];
for(i=startIndex; i<=endIndex; i++)
sourceArr[i] = tempArr[i];
}
void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex)
{
int midIndex;
if(startIndex < endIndex)
{
midIndex = (startIndex + endIndex) / 2;
MergeSort(sourceArr, tempArr, startIndex, midIndex);//一直分割
MergeSort(sourceArr, tempArr, midIndex+1, endIndex);
Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
}
}
int main()
{
//freopen("txt1.txt","r",stdin);
//freopen("txt2.txt","w",stdout);
int a[10005];
int i, b[10005];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int s=clock();
MergeSort(a, b, 0, n-1);
int e=clock();
for(i=0; i<n; i++)
printf("%d ", a[i]);
printf("\n");
//printf("%.12lfs\n",(double)(e-s)/CLOCKS_PER_SEC);
return 0;
}
补充:如何求逆序数:
在Merge()的第一个else里边计数 count +=j-k