您的位置:首页 > 职场人生

程序员必须掌握的8种排序算法(七):归并排序

2017-08-28 19:16 351 查看


七、归并排序

(一)基本思想

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。



(二)代码实现

package com.z;

import java.util.Arrays;

public class Sort {

public static void mergeSort(int[] array) {
sort(array, 0, array.length - 1);
}

private static void sort(int[] data, int left, int right) {
if (left < right) {
// 找出中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(data, left, center);
// 对右边数组进行递归
sort(data, center + 1, right);
// 合并
merge(data, left, center, right);
}
}

private static void merge(int[] data, int left, int center, int right) {
int[] tmpArr = new int[data.length];
int centerNext = center + 1;
// 记录临时数组的索引
int tmp = left;
int index = left;
while (left <= center && centerNext <= right) {
//从两个数组中取出最小的放入临时数组
if (data[left] <= data[centerNext]) {
tmpArr[tmp++] = data[left++];
} else {
tmpArr[tmp++] = data[centerNext++];
}
}

// 若右边数组还有剩余元素,把这些剩余元素依次放入临时数组
while (centerNext <= right) {
tmpArr[tmp++] = data[centerNext++];
}

// 若左边数组还有剩余元素,把这些剩余元素依次放入临时数组
while (left <= center) {
tmpArr[tmp++] = data[left++];
}

// 将临时数组中的内容复制回原数组
while (index <= right) {
data[index] = tmpArr[index++];
}
}

public static void main(String[] args) {
int[] arr = {52, 57, 59, 68, 28, 33, 72, 96};
System.out.println("Original array: " + Arrays.toString(arr));
mergeSort(arr);
System.out.println("Sorted array: " + Arrays.toString(arr));
}
}


运行结果:

Original array: [52, 57, 59, 68, 28, 33, 72, 96]

Sorted array: [28, 33, 52, 57, 59, 68, 72, 96]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: