您的位置:首页 > 其它

排序算法-- 归并排序

2016-10-07 22:32 183 查看
思路

归并排序:

将两个或者两个以上的有序列表合并成为一个有序的列表

在排序中 先是将无序列表分割成多个序列, 如果分别排序

最后排序完成,合并序列

Demo 完整源码下载

/**
* @Title: 排序基本算法
* @Package ${package_name}
* @Description: 排序基本算法
* Created by eason_hoo on 16/8/7.
*/
public abstract class BaseSorter {

//构造sort函数
public  abstract  void  sort(int[] array);

}


/**
* @Title:  归并排序
* @Package ${package_name}
* @Description: 归并排序:
*              将两个或者两个以上的有序列表合并成为一个有序的列表
*              在排序中 先是将无序列表分割成多个序列, 如果分别排序
*              最后排序完成,合并序列
*
* Created by eason_hoo on 16/10/7.
*/
public class MergeSorter extends BaseSorter {

@Override
public void sort(int[] array) {

//需要同等的空间大小
int[] temp = new int[array.length];

this.mergeSort(array,temp,0,array.length-1);

}

/**
* 合并排序算法
* @param arr
* @param temp
* @param left
* @param right
*/
private  void  mergeSort(int[] arr, int[] temp, int left, int right){

/**中间分隔值**/
int mid = (left + right)/2;

if (left == right) return;

/**将数组分为两组子序列**/
mergeSort(arr,temp,left,mid);
mergeSort(arr,temp,mid + 1, right);

int i,j,k;

/**复制左序列**/
for ( i = mid; i>=left; i--){
temp[i] = arr[i];
}

/**复制右序列**/
for (j = 1; j <= right - mid; j++){
temp[right-j+1] = arr[mid + j];
}

/**合并两个子序列**/
for (i = left,j = right,k = left;k <= right;k++)
{
if (temp[i]<temp[j])
arr[k] = temp[i++];
else
arr[k] = temp[j--];
}
}

}


算法分析

时间复杂度

每趟归并的时间为O(n),无论是在最好情况下还是在最坏情况下均是O(nlgn)。


空间复杂度

使用到一个变量,所以空间复杂度:O(1)


排序稳定性

排序稳定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: