【算法导论学习-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; } }
相关文章推荐
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 【从零学习经典算法系列】分治策略实例——归并排序(Mergesort)
- Java实现归并排序(Merge-Sort)算法
- 实现算法导论第三版中的MergeSort
- merge_sort相比算法导论简易版本实现
- 【算法导论学习-001】插入排序(InsertionSort)
- 【算法导论学习-013】堆排序(Heapsort)
- [算法]——归并排序(Merge Sort)
- [算法导论]merge sort @ Python
- 算法学习笔记 —— MergeSort 的一种循环实现
- Java实现算法归并排序(MergeSort)
- 归并排序(merge sort)算法实现
- 算法---归并排序(Merge Sort)---多版本对比
- 算法-排序-归并排序(MergeSort)分析
- 算法第三次作业(1. 排序。对文件 largeW.txt(下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort),把排序后的结果分别保存到largeW
- 归并排序(merge sort)算法实现
- 【DS】排序算法之归并排序(Merge Sort)
- 十大基础实用算法补全——归并排序(MergeSort)