您的位置:首页 > 其它

【算法导论学习-002】归并排序(MergeSort)

2014-07-31 21:38 375 查看
参考:《算法导论》P31、P34

public class MergeSortTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
/*测试归并排序的一趟排序结果*/
int[] array = { 1, 3, 6, 4, 6, 4, 8, 3, 8, 3, 0 };
mymerge(array, 0, (array.length - 1)>>>1,array.length - 1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]);

}
/*测试归并排序*/
mergeSort(array, 0, array.length-1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+"  ");

}
/*测试二路归并*/
int[] array1={1,3,5,7};
int[] array2={4,6,7,100};
int[] mergearry=bianarymerge(array1,array2);
for (int i = 0; i < mergearry.length; i++) {
System.out.print(mergearry[i]);

}

}

public static void mergeSort(int[] arr, int start, int end) {
if (start < end) {
int middle = (start + end) >>> 1;
mergeSort(arr, start, middle);
mergeSort(arr, middle + 1, end);
mymerge(arr, start, middle, end);
}
}

/*
* 归并排序的思路:首先将arr分成两部分,用leftArray和rightArray暂存,然后从头开始比较leftArray和rightArray,
* 谁小谁放入arr,相应指针移动
* 小技巧:leftArray和rightArray都增多最后一位,存放Integer.MAX_VALUE,用于不让它移动到最后
*/
public static void mymerge(int[] arr, int start, int middle, int end) {
/*拆分数组为leftArray和rightArray*/
int leftArrayLength = middle - start + 1;
int rightArrayLength = end - middle;
int[] leftArray = new int[leftArrayLength + 1];//多一位
int[] rightArray = new int[rightArrayLength + 1];//多一位
for (int i = 0; i < leftArrayLength; i++) {
leftArray[i] = arr[start + i];
}
for (int i = 0; i < rightArrayLength; i++) {
rightArray[i] = arr[middle + 1 + i];
}
/*多的最后一位记得要赋最大值*/
rightArray[rightArrayLength] = Integer.MAX_VALUE;
leftArray[leftArrayLength] = Integer.MAX_VALUE;
/*算法的关键部分,左右指针移动*/
int j = 0;
int k = 0;
for (int i = start; i <= end; i++) {
if (leftArray[j] < rightArray[k]) {
arr[i] = leftArray[j];
j++;
} else {
arr[i] = rightArray[k];
k++;
}
}

}
public static int[] bianarymerge(int[] array1,int[] array2){
int[] array=new int[array1.length+array2.length];
int i=0;
int j=0;
for(int k=0;k<array.length;k++){
if(i==array1.length){
array[k]=array2[j];
j++;
}else if(j==array2.length){
array[k]=array1[i];
i++;
}else{
if(array1[i]<array2[j]){
array[k]=array1[i];
i++;

}else{
array[k]=array2[j];
j++;
}
}
}
return array;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: