一.基本思想
归并(Merge)排序法是将待排序序列分为若干个子序列,对每个子序列进行排序,然后再把有序子序列合并为整体有序序列。
二.归并排序示例
三.归并排序的Java实现
/**
* 归并排序
* @param array
*/
public static void mergeSort(int[] array){
sort(array,0,array.length-1);
}
/**
* 排序
* @param array
* @param left
* @param right
*/
public static void sort(int[] array, int left, int right){
if(left >= right){
return; //递归出口
}
//分割
int mid = (left+right)/2;
sort(array,left,mid);
sort(array,mid+1,right);
//合并
merge(array,left,mid,right);
printArray(array);
}
/**
* 合并
* @param array
* @param left
* @param mid
* @param right
*/
public static void merge(int[] array, int left, int mid, int right){
int[] tempArr = new int[array.length]; //临时数组,存储排序好的数组
int index=left;//临时数组的下标
int center = mid+1;//右边第一个元素的下标
int first = left;//缓存数组第一个元素的下标
while(left<=mid && center<=right){
if(array[left] < array[center]){
tempArr[index++] = array[left++];
}else{
tempArr[index++] = array[center++];
}
}
//将剩余的部分放入数组,下面的两个while只有执行其中一个
while(left<=mid){
tempArr[index++] = array[left++];
}
while(center<=right){
tempArr[index++] = array[center++];
}
// //将临时数组的内容拷贝到需要排序的数组中
while(first<=right){
array[first] = tempArr[first++];
}
}
四.效率
O(nlgn)
五.应用场景
适用与外部排序。
外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。