歸併排序
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);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.