归并排序java版_归并排序Java实现
1.思想
歸并排序是利用歸并的思想實現的排序方法,該算法采用經典的分治策略
分治法將問題分成一些小的問題然后遞歸求解,而治的階段則將分的階段得到的各答案"修補"在一起,即分而治之。
總結來說(重點):把序列不斷對半拆分,直到分到僅剩一個元素,將它們排序合并;然后處理兩個元素的序列,排序合并,如此類推。
分而治之:
分:從上往下,直到拆分到一個元素
治:從下往上,從單個元素合并成一條有序的序列
再來看最后的合并階段,算法實現只需要維護兩個左右指針即可。
Java代碼實現
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int [] arr = {1,5,6,4,9,2,3,8,7};
Sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void Sort(int arr[]){
int [] temp = new int[arr.length];//開辟一個原數組長度一樣的數組,避免遞歸的時候頻繁開辟空間
Divide(arr,0,arr.length-1,temp);
}
public static void Divide(int [] arr,int left,int right,int [] temp){
if(left
int mid = (left+right)/2; //每次規模減少一半
Divide(arr,left,mid,temp); //右邊序列的排序并且歸并為一個數組
Divide(arr,mid+1,right,temp);//左邊序列的排序并且歸并為一個數組
Merge(arr,left,mid,right,temp);//合并兩個數組
}
}
public static void Merge(int [] arr,int left,int mid,int right,int [] temp){
int i = left;
int j = mid+1;
int t = 0;
// 左右兩邊移動指針比較,取較小的一個數放進temp數組
while (i<=mid && j<=right){
if (arr[i]<=arr[j]){
temp[t++] = arr[i++];
}else {
temp[t++] = arr[j++];
}
}
// 把左或右多出的數,推入數組
while (i<=mid){
temp[t++] = arr[i++];
}
while(j<=right){
temp[t++] = arr[j++];
}
// 最后把temp數組替換原數組
t = 0;
while (left<=right){
arr[left++] = temp[t++];
}
}
}
2.算法分析
歸并排序的時間復雜度包括分解,比較,合并。
最好的情況下,數組是已排序的,那么歸并排序的時間復雜度為O(n)級的。
最壞的情況下,數組是逆序的,那么歸并排序的時間復雜度為O(nlogn)級的。歸并排序的平均時間復雜度是O(nlogn)。
總結
以上是生活随笔為你收集整理的归并排序java版_归并排序Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python模拟购物车购物过程_Pyth
- 下一篇: android 发送短信 广播 demo