• 归并排序


      

    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)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

  • 相关阅读:
    开发第七天
    项目进行ing
    Spring 计划
    0505--鲜花售卖网之“NABCD模型”
    --《软件工程》奖励之“黄色领骑衫”
    0329--Scrum团队准备工作
    0428数字口袋精灵app优化
    0421--"数字口袋精灵app"二次开发(Blackbriar团队开发)
    复利计算器app发布
    0415--博客欣赏与评论
  • 原文地址:https://www.cnblogs.com/nickup/p/9763148.html
Copyright © 2020-2023  润新知