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

      

    public class Solution {
        /*
         * 将一个数组中的两个相邻有序区间合并成一个
         *
         * 参数说明:
         *     a -- 包含两个有序区间的数组
         *     start -- 第1个有序区间的起始地址。
         *     mid   -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。
         *     end   -- 第2个有序区间的结束地址。
         */
    
        public static void main(String [] args){
            int[] t = {18,7,8,6,33,2,9,1};
            mergSort(t,0,7);
            for (int i = 0;i<t.length;i++)
                System.out.print(t[i] + "	");
        }
    
        public static void mergSort(int [] arr,int l,int r){
            if(l>=r) return;
            int mid = (l+r)/2;
            //递归二分 将数组分为  [左,中],(中,右]
            mergSort(arr,l,mid);
            mergSort(arr,mid+1,r);
            //归并排序
            int aux[] = new int[r-l+1]; //这里弄一个要处理的数组副本 长度是 R-L+1
            for (int i =l;i<=r ;i++)    //副本数组从 L 开始,所以与原数组存在一个 L 的偏移量
                aux[i-l] = arr[i];
            int i = l,j = mid+1;        //i记录左边元素的下标位置 j记录右边元素的下标位置
            for (int k =l;k <= r; k++){ //k记录 arr 的下标位置
                if(i >mid){//第一个数组用完,用第二个数组
                    arr[k] = aux[j-l];
                    j++;
                }else if(j >r){//第二个数组用完了,用第一个数组
    arr[k] = aux[i-l]; i++; }else if(aux[i-l] < aux[j-l]){//比较两个数组的第一个数,谁小放谁,大的指针不变,直达他说最小的 arr[k] = aux[i-l]; i++; }else{ arr[k] = aux[j-l]; j++; } } } }

    归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/nickup/p/9763148.html
Copyright © 2011-2022 走看看