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

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

 

代码奉上:

 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 }

 排序结果:

 

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

 

posted @ 2016-10-11 20:34  stagebo  阅读(5525)  评论(0编辑  收藏  举报