排序演算法之歸併排序及Java實現
阿新 • • 發佈:2019-02-20
一、排序演算法的分類
二、歸併排序的原理
歸併排序利用的是分治的思想實現的,對於給定的一組資料,利用遞迴與分治技術將資料序列劃分成為越來越小的子序列,之後對子序列排序,最後再用遞迴方法將排好序的子序列合併成為有序序列。合併兩個子序列時,需要申請兩個子序列加起來長度的記憶體,臨時儲存新的生成序列,再將新生成的序列賦值到原陣列相應的位置。
三、歸併排序的實現
public class MergeSort {
public static void merSort(int[] arr,int left,int right){
if(left<right){
int mid = (left+right)/2;
merSort(arr,left,mid);//左邊歸併排序,使得左子序列有序
merSort(arr,mid+1,right);//右邊歸併排序,使得右子序列有序
merge(arr,left,mid,right);//合併兩個子序列
}
}
private static void merge(int [] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];//ps:也可以從開始就申請一個與原陣列大小相同的陣列,因為重複new陣列會頻繁申請記憶體
int i = left;
int j = mid+1;
int k = 0;
while(i<=mid&&j<=right){
if (arr[i] < arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while(i<=mid){//將左邊剩餘元素填充進temp中
temp[k++] = arr[i++];
}
while(j<=right){//將右序列剩餘元素填充進temp中
temp[k++] = arr[j++];
}
//將temp中的元素全部拷貝到原陣列中
for (int k2 = 0; k2 < temp.length; k2++) {
arr[k2 + left] = temp[k2];
}
}
public static void main(String args[]){
int[] test = {9,2,6,3,5,7,10,11,12};
merSort(test,0,test.length-1);
for(int i=0; i<test.length;i++){
System.out.print(test[i] + " ");
}
}
}
測試結果
2 3 5 6 7 9 10 11 12