归并排序及其应用两则
2010/12/3 - 15:24 Post by cutey
简介:归并排序(merging sort)的时间复杂度为O(nlogn),是一种稳定的排序方法。常用的2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,递归算法形式简洁,简单易用。 应用1:求逆序对数 设a[1...n]是一个包含n个不同数的数组,对于i<j如有a[i]>a[j],则称(i,j)为一个逆序对。出题方式很多,比如直接求一个序列中逆序对的个数;比如交换原序列中相邻两元素位置使之成为单调不下降序列,求交换次数等等。当然,求逆序对数的方法也很多,但时间复杂度不大于O(nlogn)就只有归并排序和平衡二叉树了吧,显然归并排序实现起来更加简单,代码如下所示。 #include <stdio.h> #define MAX 50001 int temp[MAX]; int count, n; void Merge(int *array, int s, int m, int t) { int i=s, j, k; for (j=m+1,k=s; s<=m&&j<=t; ++k) { if (array[s]<=array[j]) temp[k] = array[s++]; else { temp[k] = array[j++]; count += m-s+1; //record the inversion pairs } } while (s<=m) temp[k++] [...]