歸並排序原理,先上圖,如果是奇數個數據,我自己畫的圖,右圖
代碼奉上:
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 }
排序結果:
另外奉上各種排序圖示的小視頻一只……