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

来源:互联网 发布:php中单引号和双引号 编辑:程序博客网 时间:2024/06/07 08:48

sort.jpg

七、归并排序

(一)基本思想

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

7-1.jpg

(二)代码实现

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]

原创粉丝点击