您的位置:首页 > 编程语言 > Java开发

基础算法(三)---归并排序(Java)

2017-05-01 16:39 155 查看
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法步骤:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

设定两个指针,最初位置分别为两个已经排序序列的起始位置

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤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];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息