歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。
作為一種典型的分而治之思想的算法應用,歸并排序的實現由兩種方法:
自上而下的遞歸;
自下而上的迭代;
算法步驟
- 先將每個元素都分開
- 設定兩個指針,最初位置分別為兩個已經排序序列的起始位置(即left和mid+1);
- 比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置;
- 重復步驟 3 直到某一指針達到序列尾;
- 將另一序列剩下的所有元素直接復制到合并序列尾。
代碼實現
public class Merge_Sort {
public static void merge_sort(int[] array){
if (array==null||array.length<=0){
return;
}
merge(array,0,array.length-1);
}
//將元素拆開
public static void merge(int[] array,int left,int right){
if (left==right){
return;
}
int mid = (left+right)/2;
merge(array, left, mid);
merge(array,mid+1,right);
sort(array,left,right,mid);
}
public static void sort(int[] array,int left,int right,int mid){
int[] temp = new int[array.length];
int i = left;
int j = mid+1;
int t = 0;
while (i<=mid && j<=right){
if (array[i]<=array[j]){
temp[t++] = array[i++];
}else {
temp[t++] = array[j++];
}
}
while (i<=mid){
temp[t++] = array[i++];
}
while (j<=right){
temp[t++] = array[j++];
}
t=0;
while (left<=right){
array[left++] = temp[t++];
}
}
public static void main(String[] args) {
int[] array = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
merge_sort(array);
System.out.println(Arrays.toString(array));
}
}