归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并查询的时间复杂度为O(NlogN),使用它来排序大多数的数是非常快的。
归并排序原理: 用递归调用的方式,不断向下递归把数组拆分为两部分,直至只有一个元素,出递归,然后向上归并排序。直到所有元素排序完毕(参考图如下)
Java实现归并排序代码:
package Merge;
import java.util.Arrays;
public class MergeSort {
private MergeSort(){
}
private static void merge(int [] arr,int l,int mid ,int r) {
int [] aux =Arrays.copyOfRange(arr, l, r+1);
int i = l, j = mid+1;
for (int k = l ; k <= r; k ++ ) {
if( i > mid ){ // 如果左半部分元素已经全部处理完毕
arr[k] = aux[j]; j ++;
}
else if( j > r ){ // 如果右半部分元素已经全部处理完毕
arr[k] = aux[i-l]; i ++;
}
else if( aux[i-l] < aux[j-l] ){ // 左半部分所指元素 < 右半部分所指元素
arr[k] = aux[i-l]; i ++;
}
else{ // 左半部分所指元素 >= 右半部分所指元素
arr[k] = aux[j-l]; j ++;
}
}
}
private static void sort(int [] arr,int l, int r) {
if(l>=r)
return ;
int mid =(l+r)/2;
sort(arr,l,mid);
sort(arr,mid+1,r);
if(arr[mid]>arr[mid+1])//优化方式,对有序的不用再排序
merge(arr,l, mid,r);
}
public static void sort(int [] arr) {
int n =arr.length;
sort(arr, 0, n-1);
}
public static void main(String[] args) {
int [] arr= {4,3,2,1};
MergeSort.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);;
System.out.print(" ");
}
}
}
总结:
对于归并排序的归并过程,需要开辟新的空间以辅助进行这个排序过程。这也是归并排序的一大缺点,极度占用内存空间。但是在当今时代时间资源和空间资源相比较时间资源相对来说宝贵得多,因为空间资源相对越来越廉价,可用存储空间也越来越多,因此在这种情况下,优先考虑的情况为时间复杂度。