是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
算法要点
- 通过递归的模式,将序列不断的从中间拆分,直到不可拆分为止,这一步骤称为“分”
- 通过递归的模式,将拆分后的两个序列通过对比两个序列的每个元素,将其合并到一起,直到所有序列都合并完成,这一步骤被称为“治”
动图演示

代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| package Sort;
public class Sort {
public int[] mergeSort(int[] data, int left, int right) { int middle = (left + right) / 2; if (right - left > 1) { if (middle - left >= 1) { data = mergeSort(data, left, middle); } if (right - middle >= 0) { data = mergeSort(data, middle + 1, right); } } return mergeSort(data, left, middle, right); }
protected int[] mergeSort(int[] data, int left, int middle, int right) { int[] temp = new int[data.length];
int l = left; int m = middle + 1; int i = 0; while (l <= middle && m <= right) { if (data[l] > data[m]) { temp[i] = data[m]; m++; i++; } else { temp[i] = data[l]; l++; i++; } }
while (l <= middle) { temp[i] = data[l]; l++; i++; }
while (m <= right) { temp[i] = data[m]; m++; i++; }
for (int j = right; j >= left; j--) { data[j] = temp[i - 1]; i--; } return data; } }
|