一、归并排序(MergeSort)
排序原理可参考:https://www.cnblogs.com/chengxiao/p/6194356.html
归并排序的运用实例:Kendall tau距离(求两个排列之间的逆序数)
解体的核心原理:以a序列为原始的数据顺序,然后写出b数组的位置序列。求出b序列的逆序数就为两个数组的Kendall tau距离。
详细分析可参考:http://blog.csdn.net/zhufenghao/article/details/49594035
public class KendallTau_youhuaban {
public static int counter = 0;
public static int distance(int[] a, int[] b) {
if(a.length != b.length) throw new IllegalArgumentException("argument illegal");
int N = a.length;
int[] aIndex = new int[N];
int []bIndex = new int[N];
for(int i =0; i<N; i++) {
aIndex[a[i]] = i;
}
for(int i =0; i<N; i++){
bIndex[i] = aIndex[b[i]];
}
MergeCount(bIndex);
return counter;
}
public static void MergeCount(int[] bIndex){
int N = bIndex.length;
int[] temp = new int[N];//先创建一个临时数组,以免在递归过程中重复的创建temp数组;
MergeSort(bIndex, 0, N-1,temp);
}
public static void MergeSort(int[] bIndex, int low, int high, int[] temp) {
int mid = (low + high)/2;
if(low >= high) {//可以直接写成low == high???
return;
}
MergeSort(bIndex, low, mid, temp);
MergeSort(bIndex, mid+1, high, temp);
Merge(bIndex, low, mid, high, temp);
}
public static void Merge(int[] bIndex, int low, int mid, int high, int[] temp) {
int i = low;
int j = mid+1;
int k = 0;
while(i <= mid && j <= high){
if(bIndex[j] < bIndex[i]) {
counter += (mid-i + 1);
temp[k++] = bIndex[j++];
}else{
temp[k++] = bIndex[i++];
}
}
while(i <= mid) {
temp[k++] = bIndex[i++];
}
while(j <= high) {
temp[k++] = bIndex[j++];
}
k = 0;
while(low <= high) {
bIndex[low++] = temp[k++];
}
}
public static void main(String[] args) {
int[] a = new int[] { 0, 3, 1, 6, 2, 5, 4 };
int[] b = new int[] { 1, 0, 3, 6, 4, 2, 5 };
System.out.println("distance = " + distance(a,b));
}
}
后续:
参照博客,写完所有排序算法。:https://www.cnblogs.com/chengxiao/p/6194356.html