zoukankan      html  css  js  c++  java
  • java算法 -- 归并排序

    归并排序:

    先分解再合并。

    分解:分为若干个子序列,每个子序列是有序的。

    合并:然后再把有序子序列合并为整体有序序列。

    public class MergeSortTest {
    
    
        public static void main(String[] args) {
            int[] array = {1, 2, 5, 41, 7, 11, 13, 17, 59, 19, 23, 29, 31, 37, 43, 47, 53};
            int[] hillSortArrays = mergeSort(array);
            for (int s : hillSortArrays) {
                System.out.print(s + " ");
            }
        }
    
        /**
         * 归并排序
         *
         * @param arrays 要排序的数组
         * @return 排序后的数组
         */
        private static int[] mergeSort(int[] arrays) {
            return sort(arrays, 0, arrays.length - 1);
        }
    
        private static int[] sort(int[] data, int left, int right) {
            if (left >= right) {
                return data;
            }
            // 找出中间索引
            int center = (left + right) / 2;
            // 对左边数组进行递归
            sort(data, left, center);
            // 对右边数组进行递归
            sort(data, center + 1, right);
            // 合并
            return merge(data, left, center, right);
        }
    
        /**
         * 将两个数组进行归并,归并前面 2 个数组已有序,归并后依然有序
         *
         * @param data 数组对象
         * @param left 左数组的第一个元素的索引
         * @param center 左数组的最后一个元素的索引,center+1 是右数组第一个元素的索引
         * @param right
         * @return 排序后的数组
         */
        private static int[] merge(int[] data, int left, int center, int right) {
            // 临时数组
            int[] tmpArr = new int[data.length];
            // 右数组第一个元素索引
            int mid = center + 1;
            // third 记录临时数组的索引
            int third = left;
            // 缓存左数组第一个元素的索引
            int tmp = left;
            while (left <= center && mid <= right) {
                // 从两个数组中取出最小的放入临时数组
                if (data[left] <= data[mid]) {
                    tmpArr[third++] = data[left++];
                } else {
                    tmpArr[third++] = data[mid++];
                }
            }
            // 剩余部分依次放入临时数组(实际上两个 while 只会执行其中一个)
            while (mid <= right) {
                tmpArr[third++] = data[mid++];
            }
            while (left <= center) {
                tmpArr[third++] = data[left++];
            }
            // 将临时数组中的内容拷贝回原数组中
            // (原 left-right 范围的内容被复制回原数组)
            while (tmp <= right) {
                data[tmp] = tmpArr[tmp++];
            }
    
            return data;
        }
    }
    
    
  • 相关阅读:
    2 字符串String
    1 概述
    20199326 2019-2020-2 《网络攻防实践》第十周作业
    20199326 2019-2020-2 《网络攻防实践》第九周作业
    20199326 2019-2020-2 《网络攻防实践》第八周作业
    20199326 2019-2020-2 《网络攻防实践》第七周作业
    南北流量与东西流量
    20199326 2019-2020-2 《网络攻防实践》第六周作业
    20199326 2019-2020-2 《网络攻防实践》第5周作业
    http嗅探工具fiddler的使用
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/10789109.html
Copyright © 2011-2022 走看看