排序算法-- 归并排序
2016-10-07 22:32
183 查看
思路
归并排序:
将两个或者两个以上的有序列表合并成为一个有序的列表
在排序中 先是将无序列表分割成多个序列, 如果分别排序
最后排序完成,合并序列
Demo 完整源码下载
算法分析
时间复杂度
空间复杂度
排序稳定性
归并排序:
将两个或者两个以上的有序列表合并成为一个有序的列表
在排序中 先是将无序列表分割成多个序列, 如果分别排序
最后排序完成,合并序列
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)
排序稳定性
排序稳定
相关文章推荐
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较
- 排序算法系列六(归并排序)
- 常用排序算法2--归并排序和快速排序
- 数据结构(C#)_排序算法(归并排序)
- 改进排序算法:归并排序
- 经典排序算法 -----冒泡排序,插入排序,快速排序,归并排序,堆排序
- 排序算法之归并排序
- 排序算法之归并排序(JAVA)
- 排序算法之两路归并排序(Java)
- 排序算法—归并排序
- 排序算法之归并排序
- 排序算法(四)——归并排序
- 排序算法 - 归并排序
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- 排序算法----归并排序
- 排序算法:归并排序
- 排序算法之归并排序
- 递归实现归并排序(基本排序算法)
- 排序算法之归并排序
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较