归并排序算法

一、归并排序分治思想。

  求解一个比较复杂的问题时我们通常都会把复杂的问题分解为几个简单的步骤逐一解决后对所形成的解进行处理得到最终解。分治排序算法就是利用这个思想。把一个给定数组进行拆分成最小的有顺序的单元,然后对最小单元进行排序组合成新数组的过程。

二、归并排序图解(viso到期了懒得激活先用画图顶上后面有时间再激活重画有点丑对付看看😜)

如图为分治过程逐步分解为最小的有序数列。

2、归并排序

把分好的数组进行按从小到大组合成新数组递归重复操作完成归并排序

3、代码实现Java版

(1)分治实现

  通过递归不断折半计算开始和结束下标实现。先是每次递归左边直至为一个元素然后回退递归右边如果也是有序数组合并成新数组最终得到排序后新数组。

 public static void fenzhisort(int array[],int start,int end){
      if(array==null||start>=end){//判断是否分治到一个节点以及空数组判断。
          return ;//递归出口
      }
      Integer mid=(start+end)/2;//分半分治
        fenzhisort(array,start,mid);//左半边数组递归
        fenzhisort(array,mid+1,end);//右半边递归
        midle(array,start,mid,end);//通过递归组合数组
    }

(2)归并排序

  递归调用合并方法对传过来索引通过中间数组进行排序并重新赋值给原数组,这里由于数组传的是地址传递改变原数组既改变原数组。注意要把剩余没有比较的元素拼回到中间数组

    private static void midle(int[] array, int start, Integer mid, int end) {
        //定义一个数组
        int Arraytamp[]=new int[array.length];
        int p=start;//记录要组合的左侧数组索引
        int q=mid+1;//记录要组合的右侧索引mid值为左侧数组最后一个元素加一为第二个数组起始索引
        int i=0;//记录定义数组索引
        while (p<=mid && q<=end){//判断是否左右索引其中之一到达末尾,未到达则循环向定义的数组填入值
            if(array[p]<=array[q]){//逐一对比数组每个元素,由于左右数组有序则顺序比较即可把按照从小到大依次放入定义的数组中
                Arraytamp[i]=array[p];//放左边元素
                p++;i++;//放入后索引后移
            }
            else {
                Arraytamp[i]=array[q];//放右边元素
                q++;i++;
            }
        }
        while (p<=mid){//判断左边是否便利完成没有则把剩余的拼在后面
            Arraytamp[i++]=array[p++];

        }
        while (q<=end){//判断右边是否便利完成没有则把剩余的拼在后面
            Arraytamp[i++]=array[q++];
        }
        for (int j=0;j<i;j++){//根据数组元素更新原数组
            array[start+j]=Arraytamp[j];
        }
    }

 

    public static void main(String[] args) {
        int a[]={1,3,2,5,2,4,2,7,4,8,9,0,3,6};
        fenzhisort(a,0,a.length-1);

            System.out.println(Arrays.toString(a));

    }

 

posted @   鹏哥学代码  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示