归并排序(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];
}
}
}