排序算法(五 )归并排序
1.算法思路
归并排序(Merge-Sort)是一种基于二叉堆及分而治之思想的排序算法。即将一个无序序列拆分成 2/n 段无序子序列,然后排序子序列,使子序列有序后再合并为一个有序序列,如“图1 归并排序”所示:


2.复杂度
- 时间复杂度:O(nlogn)。
- 空间复杂度:T(n),该算法在排序过程中需要一个辅助数组,也就是说至少同时需要有两个等长的数组。
- 稳定性:归并排序是稳定算法。
3.代码实现
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] array = {9, 11, 3, 6, 5, 2, 8};
MergeSort mergeSort = new MergeSort(array);
mergeSort.mergeSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
int[] arr;
public MergeSort(int[] array) {
// 事先创建一个等长数组,在递归过程中就无需再频繁开辟空间
arr = new int[array.length];
}
/**
* 递归调用
* 将数组拆分
* @param array 原数组
* @param left 数组中最左边的下标
* @param right 数组中最右边的下标
*/
public void mergeSort(int[] array, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
}
/**
* 将数组合并
* @param array 原数组
* @param left 最左边下标
* @param mid 中间下标
* @param right 最右边下标
*/
public void merge(int[] array, int left, int mid, int right) {
int l = left; // 左序列指针
int r = mid + 1; // 右序列指针
int temp = 0; // 临时指针
// 拆分出来的两组数据依次循环对比后插入临时数组
// 当某一方先比较排序完,则无需再比较
while (l <= mid && r <= right) {
if (array[l] <= array[r]) {
arr[temp++] = array[r++];
} else{
arr[temp++] = array[l++];
}
}
// 若左边序列还未排序完,则直接将左边数组插入临时数组
while (l <= mid) {
arr[temp++] = array[l++];
}
// 若右边序列还未排序完,则直接将左边数组插入临时数组
while (r <= right) {
arr[temp++] = array[r++];
}
// 将刚刚插入临时数组中的数据复制到原数组中
temp = 0;
while (left <= right) {
array[left++] = arr[temp++];
}
}
}
网友评论