【好记性不如烂笔头】分冶算法之归并排序

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

 

代码奉上:

 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 }

 排序结果:

 

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

 

转载于:https://www.cnblogs.com/wyongbo/p/Devide.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值