zoukankan      html  css  js  c++  java
  • 高级排序--归并排序

    排序原理:

    1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。

    2.将相邻的两个子组进行合并成一个有序的大组;

    3.不断的重复步骤2,直到最终只有一个组为止。

    排序过程:

    例:{8,4,5,7,1,3,6,2}

    package com.sort;
    /*--------------
     *  Author:Real_Q
     *  Date:2021-01-09
     *  Time:10:44
     *  Description:归并排序
    ---------------*/
    public class MerageSort {
    
        public static void merageSort(int[] array) {
            int low = 0;
            int high = array.length - 1;
            merageSort(array, low, high);
        }
    
        private static void merageSort(int[] array, int low, int high) {
            //如果low>=high,跳出函数
            if (low >= high) {
                return;
            }
            //把数组分成相等的两等分
            int middle = low + (high - low) / 2;
            //对分组的数组进行排序,递归调用函数本身
            merageSort(array,low,middle);
            merageSort(array,middle+1,high);
            //对排序好的分数组进行合并
            mergage(array,low,middle,high);
        }
    
        private static void mergage(int[] array, int low, int middle, int high) {
            //存放左子数组起始索引
            int left = low;
            //存放右子数组索引
            int right = middle+1;
            //存放辅助数组起始索引
            int index = low;
            //定义一个辅助数组
            int[] assit = new int[array.length];
    
            //扫描左子组 右子组元素
            while(left <= middle && right <= high ){//无论哪一个先扫描完 跳出循环
                //把最小的值赋值给辅助数组,对应索引和辅助数组索引加一
                if(less(array[left],array[right])){
                    assit[index++] = array[left++];
                }else{
                    assit[index++] = array[right++];
                }
            }
    
            //跳出循环,如果左子组未扫描完,将剩余的元素放在已完成扫描的数组后面
            while(left <= middle){
                assit[index++] = array[left++];
            }
            //跳出循环,如果左子组未扫描完,将剩余的元素放在已完成扫描的数组后面
            while(right <= high ){
                assit[index++] = array[right++];
            }
    
            //讲完成排序的辅助数组的值赋值给原数组
            for (int i = low; i <= high ; i++) {
                array[i] = assit[i];
            }
        }
    
        //比较两个元素的大小,返回比较结果
        public static boolean less(int a, int b) {
            return (a - b < 0);
        }
    
        //交换数组中的两个元素
        public static void exchange(int[] array, int index1, int index2) {
            int temp;
            temp = array[index1];
            array[index1] = array[index2];
            array[index2] = temp;
        }
    }
    
    

    测试类:

    package com.testsort;
    /*--------------
     *  Author:Real_Q
     *  Date:2021-01-09
     *  Time:11:43
     *  Description:
    ---------------*/
    import java.util.Arrays;
    import static com.sort.MerageSort.merageSort;
    public class TestMerage {
        public static void main(String[] args) {
            int[] array = {8,4,5,7,1,3,6,2};
            merageSort(array);
            System.out.println(Arrays.toString(array));
        }
    }
    
    
  • 相关阅读:
    Python开发之路-多进程、进程队列、事件驱动模型、IO模型前戏
    Python开发之路
    cookies,sessionstorage,localstorage的区别?
    Linux的nmon监控结果分析文件中网络分析NET
    长字符串写法
    go中语句为什么不用加分号;结束
    %v的使用
    设计模式--装饰器模式
    第一类值VS第二类值
    闭包
  • 原文地址:https://www.cnblogs.com/RealQ/p/14259515.html
Copyright © 2011-2022 走看看