zoukankan      html  css  js  c++  java
  • 【好记性不如烂笔头】分冶算法之归并排序

    归并排序原理,先上图,如果是奇数个数据,我自己画的图,右图

    代码奉上:

     1 package com.servlet;
     2 
     3 public class MyMergeSort {
     4     public static void main(String[] args) {
     5         int[] array={2,4,7,5,8,1,3,6};
     6         printArray(array);
     7         
     8         devide(array,0,array.length-1);
     9         
    10         System.out.println("排序后:");
    11         printArray(array);
    12     }
    13     /*分解数据*/
    14     public static void devide(int[] array,int left,int right){
    15         
    16         if(left<right){
    17             /*寻找到中间下标*/
    18             int mid=(right+left)/2;
    19             /*从中间下标隔断,将前后两段分别分解*/
    20             devide(array,left,mid);
    21             /*继续分割第二段*/
    22             devide(array,mid+1,right);
    23             /*分割完了,调用归并*/
    24             merge(array,left,mid,mid+1,right);    
    25         }
    26     }
    27     /*归并,包含排序*/
    28     public static void merge(int[] array,int leftStart,int leftEnd,int rightStart,int rightEnd){
    29         /*新建临时数组,存放该次归并后的数据*/
    30         int[] temp=new int[array.length];
    31         /*记录归并的左组和右组开始结束下标*/
    32         int ls=leftStart,le=leftEnd,
    33             rs=rightStart,re=rightEnd;
    34         /*记录临时数组的存放位置*/
    35         int index=ls;
    36         /*第一次比较归并,左组合右组中较小的入temp*/
    37         while(ls<=le&&rs<=re){
    38             if(array[ls]<=array[rs]){
    39                 temp[index]=array[ls];
    40                 index++;ls++;
    41             }else{
    42                 temp[index]=array[rs];
    43                 index++;rs++;
    44             }    
    45         }
    46         /*第二次选择归并,将array中剩余的未加入temp的数加入到temp中*/
    47         while(ls<=le){
    48             temp[index]=array[ls];
    49             ls++;index++;
    50         }
    51         while(rs<=re){
    52             temp[index]=array[rs];
    53             rs++;index++;
    54         }
    55         /*temp是经过调整后的array,此时一次归并完毕,返回数据进行下一次归并*/
    56         while(leftStart<=rightEnd){
    57             array[leftStart]=temp[leftStart];
    58             leftStart+=1;
    59         }
    60         /*打印本次归并结果*/
    61         printArray(array);
    62     }
    63     public static void printArray(int[] array){
    64         for(int i=0;i<array.length;i++)
    65             System.out.print(array[i]+"  ");
    66         System.out.println();
    67     }
    68     
    69     
    70 }

     排序结果:

     另外奉上各种排序图示的小视频一只……

    黑夜给了我黑色的眼睛,我却用它寻找光明
  • 相关阅读:
    Linux 性能优化--理解 CPU 使用率和平均负载
    sqlalchemy ORM
    redis缓存数据库
    基于CentOS安装FTP服务器
    python3之platform模块
    paramiko模块
    shelve模块
    Vue入门---属性、style和class绑定方法
    Vue入门---事件与方法详解
    Vue入门---常用指令详解
  • 原文地址:https://www.cnblogs.com/wyongbo/p/Devide.html
Copyright © 2011-2022 走看看