基础算法(三)---归并排序(Java)
2017-05-01 16:39
155 查看
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
算法步骤:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
算法步骤:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
public class MergeSort { public static <T extends Comparable<? super T>> void mergeSort(T[] a) { T[] tmpArray = (T[]) new Comparable[a.length]; mergeSort(a, tmpArray, 0, a.length - 1); } private static <T extends Comparable<? super T>> void mergeSort(T[] a, T[] tmpArray, int left, int right) { if (left < right) { int center = (left + right) / 2; mergeSort(a, tmpArray, left, center); mergeSort(a, tmpArray, center + 1, right); merge(a, tmpArray, left, center + 1, right); } } private static <T extends Comparable<? super T>> void merge(T[] a, T[] tmpArray, int leftPos, int rightPos, int righEnd) { int leftEnd = rightPos - 1; int tmpPos = leftPos; while (leftPos <= leftEnd && rightPos <= righEnd) { if (a[leftPos].compareTo(a[rightPos]) <= 0) { tmpArray[tmpPos++] = a[leftPos++]; } else { tmpArray[tmpPos++] = a[rightPos++]; } } while (leftPos <= leftEnd) { tmpArray[tmpPos++] = a[leftPos++]; } while (rightPos <= righEnd) { tmpArray[tmpPos++] = a[rightPos++]; } for (int i = 0; i < a.length; i++, righEnd--) { a[righEnd] = tmpArray[righEnd]; } } }
相关文章推荐
- 『JAVA基础』朋友的需求,关于一个算法
- 中国年历算法和程式-Java基础-Java-编程开发
- [转]Java基础算法集50题
- java 算法基础之二快速排序算法
- java 算法基础之七希尔排序
- java基础2.(算法的8个实例)
- 算法基础之排序篇-归并排序
- java基础之归并排序
- 基础算法系列(五)——归并排序
- 归并排序--基础的算法
- java基础知识之 算法 九九乘法表
- java基础知识之 算法 【冒泡排序】【快速排序】
- java 算法基础之一寻找最大公约数
- java算法专题-归并排序
- java实现的18位身份证格式验证算法-Java基础-Java-编程开发
- Java基础部分-数组和简单算法
- Java基础之两个小算法
- java 算法基础之四堆排序法
- java 算法基础之六插入排序与冒泡排序
- 用Java实现归并排序(Merge-Sort)算法