归并排序指的是将两个已经排序的序列合并成一个序列的操作。归并排序具体工作的原理如下(假设序列共有n个元素):
1)将序列每相邻的两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素。
2)将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素。
3)重复步骤2,直到所有的元素排序完毕。
Java实现归并排序算法:
package com.review.sort;
public class MergeSort {
// 二路归并
public static void merge(int array[], int start1, int end1, int start2, int end2) {
int i, j;
i = start1;
j = start2;
int k = 0;
int[] temp = new int[end2 - start1 + 1];
while (i <= end1 && j <= end2) {
if (array[i] > array[j])
temp[k++] = array[j++];
else
temp[k++] = array[i++];
}
// 把剩下的元素依次放入临时数组中(肯定只剩下一方)
while (i <= end1)
temp[k++] = array[i++];
while (j <= end2)
temp[k++] = array[j++];
k = start1;
for (int m = 0; m < temp.length; m++) {
array[k++] = temp[m];
}
}
public static void mergeSort(int array[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
// 两路归并
mergeSort(array, start, mid);
mergeSort(array, mid + 1, end);
merge(array, start, mid, mid + 1, end);
}
}
public static void main(String[] args) {
int[] a = { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
int i;
mergeSort(a, 0, a.length - 1);
for (i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
算法分析:
归并排序算法是一种O(n log n)的算法。它的最差时间复杂度、平均时间复杂度、最好时间都是O(n log n)。但是它需要额外的存储空间,这在某些内存紧张的机器上会受到限制。归并算法是由分割和归并两部分组成的,对于分割部分,如果我们使用二分查找,时间是O(n log n),在最后归并的时候,时间是O(n),所以总的时间O(n log n)。
归并排序是稳定排序,空间复杂度为O(n)。
3万+

被折叠的 条评论
为什么被折叠?



