归并排序
归并排序算法采用分治策略,将两个已有序的序列归并为一个更大的有序序列,通过递归思想,层层合并,最终得到一个完整的有序序列。
Java实现
递归排序
public static void mergeSort(int[] array ,int low , int high){
if(low < high ){
int mid = (low + high)/2;
//归并左边
mergeSort(array , low , mid);
//归并右边
mergeSort(array , mid + 1 , high);
//归并左右两个子数组
merge(array , low , high);
}
}
归并两个已有序的序列
public static void merge(int[] array,int low , int high){
int mid = (low + high)/2;
//创建两个数组暂时存放子数组
int[] a = new int[mid - low + 1];
int[] b = new int[high - mid];
for (int i = low , j = 0; i <= mid ; i++,j++) {
a[j] = array[i];
}
for (int i = mid + 1 , j = 0; i <= high ; i++,j++) {
b[j] = array[i];
}
int i , j , k;
for(i = 0 , j = 0 , k = low; i < a.length && j < b.length ; k++){
if(a[i] < b[j]){
array[k] = a[i++];
}else{
array[k] = b[j++];
}
}
//剩下的元素直接放入
if(i == a.length){
while( j < b.length)
array[k++] = b[j++];
}else if (j == b.length){
while ( i < a.length )
array[k++] = a[i++];
}
}
测试和运行结果
public static void main(String[] args) {
int[] a = new int[]{5, 7, 9, 8, 6, 3, 4, 2, 1};
mergeSort(a , 0 , a.length - 1);
display(a);
}
1 2 3 4 5 6 7 8 9
算法特点
- 归并排序算法是稳定的排序算法
- 时间复杂度O(n*logn)
- 空间复杂度O(n)