【好記性不如爛筆頭】分冶算法之歸並排序


歸並排序原理,先上圖,如果是奇數個數據,我自己畫的圖,右圖

 

代碼奉上:

 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 }

 排序結果:

 

 另外奉上各種排序圖示的小視頻一只……

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM