【好记性不如烂笔头】分冶算法之归并排序
归并排序原理,先上图,如果是奇数个数据,我自己画的图,右图
代码奉上:
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 }
排序结果:
另外奉上各种排序图示的小视频一只……
黑夜给了我黑色的眼睛,我却用它寻找光明