歸併排序(merge sort):歸併是將兩個或者兩個以上的有序表合併成一個新的有序表。歸併排序使用分而治之的方法進行排序:
- 分解:將待排序的n個元素分解成兩個子序列,每個序列包括n/2個元素。
- 治理:對每個子序列分別排序。
- 合併:將兩個排序好的子序列合併,生成排序結果。
歸併排序的最優時間複雜度、最差時間複雜度和平均時間複雜度均爲O(nlogn)。
歸併排序的空間複雜度爲O(n)。
歸併排序多次進行上述操作,將數組進行分解直到所有的子序列長度爲1,然後依次進行合併,算法時間複雜度爲O(nlogn)。實現方法如下:
public class MergeSort {
public static void main(String[] args) {
int[] array = {14,12,15,13,11,16};
int[] result = sort(array, 0, array.length - 1);
for(int i:result){
System.out.println(i);
}
}
public static int[] sort(int[] array, int low, int high) {
int mid = (low + high)/2;
if(low < high){
//遞歸排序
sort(array, low, mid);
sort(array, mid + 1, high);
//左右歸併,將兩個有序序列進行合併
merge(array, low, mid, high);
}
return array;
}
public static void merge(int[] array, int low, int mid, int high) {
//臨時開創的新數組,用於存儲合併後的有序數組
int[] temp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= high){
if(array[i] < array[j]){
temp[k++] = array[i++];
}
else{
temp[k++] = array[j++];
}
}
while(i <= mid){
temp[k++] = array[i++];
}
while(j <= high){
temp[k++] = array[j++];
}
for(int x = 0; x < temp.length; x++){
array[low + x] = temp[x];
}
}
}