归并排序,时间复杂度O(nlgn),相比快速排序和堆排序,优势是排序稳定。通过两两分拆、归并实现。在子数组长度小于等于7(一说50)时可采用插入排序来提高效率(但我在本机上测试,两者带来的提升并不明显)。JDK自带的Collections.sort方法采用的即是归并排序。
public class MergeSort {
private int[] temp;
public void sort(int arr[], int start, int to) {
if (arr == null || arr.length == 0 || start < 0 || end < 0) {
return;
}
if (start >= to) {
return;
}
int middle = (start + to) >> 1;
sort(arr, start, middle);
sort(arr, middle + 1, to);
merge(arr, start, middle, to);
}
public void merge(int[] arr, int start, int middle, int end) {
int index = start;
int from = start;
int to = middle + 1;
while (from <= middle && to <= end) {
if(arr[from]<=arr[to]){
temp[index++]=arr[from++];
}else{
temp[index++]=arr[to++];
}
}
while(from<=middle){
temp[index++]=arr[from++];
}
while(to<=end){
temp[index++]=arr[to++];
}
while(start<=end){
arr[start]=temp[start++];
}
}
}
本文介绍归并排序的基本原理,其时间复杂度为O(nlgn),是一种稳定的排序算法。通过递归将数组分成子数组再合并,适用于JDK自带的排序方法中。当子数组长度小于一定值时,可以采用插入排序进行优化。
2094

被折叠的 条评论
为什么被折叠?



