歸併排序


import java.util.Arrays;


/**
 * 歸併排序
 * @author Aobo
 *
 */
public class MergeSort {
/**
* 合併數組,比如:     

*                    23456789
*   合併                                                       ^
*                        |
*            2 6 7 8          3 4 5 9
*   合併                                  ^             ^
*                 |             |
*            7 8     2 6   3 4     5 9
* @param a   要合併的數組
* @param start   左邊開始的下標
* @param middle   右邊開始的下標
* @param end   右邊結束下標
* @return    返回合併的數組a
*/
public static int[] merge(int[] data,int start,int middle,int end){
// System.out.println("middle=="+middle);
int lengthLeft = middle - start+1;   //左數組的長度
int lengthRight = end - middle;      //右數組的長度
//多分配一個元素作爲哨兵  
int[] arrayLeft = new int[lengthLeft+1];
int[] arrayRight = new int[lengthRight+1];
//給左數組賦值
for(int i = 0;i<lengthLeft;i++){
arrayLeft[i] = data[start+i];
}
//給右數組賦值
for(int i = 0;i<lengthRight;i++){
arrayRight[i] = data[middle+1+i];
}
// 最後一個元素哨兵
arrayLeft[lengthLeft] = Integer.MAX_VALUE;
arrayRight[lengthRight] = Integer.MAX_VALUE;

//左右下標
int i = 0;
int j = 0;

for(int k = start;k<=end;k++){
if(arrayLeft[i]<arrayRight[j]){
data[k] = arrayLeft[i]; 
i++;
}else{
data[k] = arrayRight[j];
j++;
}
}
return data;
}
/**
* 分治排序數組
* @param a   要分治排序的數組
* @param p   左邊開始的數組下標
* @param r   右邊結束下標
* @return    返回排序好的數組a
*/
public static int[] mergerSort(int[] data,int start, int end){
if(start<end){
int middle = (start+end)/2;
mergerSort(data,start,middle);    //拆分數組(左邊)
mergerSort(data,middle+1,end);    //拆分數組(右邊)
merge(data,start,middle,end);     //分治法排序數組
System.out.println(Arrays.toString(data));
}
return data;

public static void main(String[] args) {
int[] data= new int[]{1,3,11,2,25,6,12,4,5,8,12,7,9,0,13,1,10,12,18};
// int data[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62,
// 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51 };
int middle = (data.length-1)/2;
int[] b = mergerSort(data, 0, data.length-1);
System.out.println(Arrays.toString(data));
System.out.println(data.length);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章