zoukankan      html  css  js  c++  java
  • 分治算法的完美使用----归并排序

    归并排序(Merge Sort)算法完全依照了分治模式
      分解:将 n 个元素分成各含 n/2 个元素的子序列;
      解决:对两个子序列递归地排序;
      合并:合并两个已排序地子序列以得到排序结果;
    和快速排序不同的是
      归并的划分比较随意,快排重点就是划分
      归并的重点就是合并,快排不需要合并

    代码:

    import java.util.Arrays;
    
    public class MergeSort {
    
        public static void main(String[] args) {
            int arr[] = new int[10];
            for(int i=0;i<10;i++){
                arr[i] = (int) ((Math.random()+1)*10);
            }
            
            
            System.out.println("排序前:"+Arrays.toString(arr));
            mergeSort(arr, 0, arr.length-1);
            System.out.println("排序后:"+Arrays.toString(arr));
    
        }
        
        /**
         * 思路:将数组分为左右两个数组,递归调用归并进行排序
         *         分别排序完成后,使用辅助的合并函数将两个有序的子数组合并成一个整体有序的数组
         * 时间复杂度:均:O(nlgn),好:O(nlgn),坏:O(nlgn)
         * 空间复杂度:需要开辟辅助空间,该辅助空间可以重用,大小为N
         * 非原址排序
         * 稳定性:所有排序都是归并,在左的永远在左,在右的永远在右,稳定
         */
        
        static int[]helper;
        
        private static void mergeSort(int[] arr, int p, int r) {
            
            if (p<r) {
                int mid = p + ((r-p)>>1);
                mergeSort(arr, p, mid);  // 对左侧排序
                mergeSort(arr, mid+1, r);  // 对右侧排序
                merge(arr,p,mid,r);    // 合并
            }
            
        }
    
        private static void merge(int[] arr, int p, int mid, int r) {
            
            // 下面这行代码只能在这里使用,不能在主方法使用。
            helper = Arrays.copyOf(arr, arr.length);  //开辟的一个辅助空间  并拷贝数据
            
            int left = p;  // 左侧队伍的头部指针,指向待比较的元素
            int right = mid + 1;   // 右侧队伍的头部指针,指向待比较的元素
            int current = p;       // 原数组的指针,指向待填入数据的位置
            
            while(left<=mid&&right<=r){
                if (helper[left]<=helper[right]) {
                    arr[current] = helper[left];
                    current++;
                    left++;
                }else {
                    arr[current] = helper[right];
                    current++;
                    right++;
                }
            }
            
            // 如果辅助数组右侧的数据没有全部填入原数组  那么不用管 因为原数组数据存在的
            // 那么只需要考虑辅助数组左侧的数据没有全部填入原数组的情况
            if (left<=mid) {
                while(left<=mid){
                    arr[current] = helper[left];
                    current++;
                    left++;
                }
            }
            
        }
    
    }

    结果:

      

  • 相关阅读:
    Rabbitmq的使用四_Java Client方式使用Topic模式
    CentOS7安装Redis
    nmon文件结果分析
    nmon安装
    jmeter+ant+jenkins
    jenkins插件下载加速
    jmeter:多机联合负载
    jmeter Linux负载机出错Server failed to start:
    jenkins安装
    fiddler:筛选请求响应
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10264393.html
Copyright © 2011-2022 走看看