zoukankan      html  css  js  c++  java
  • 归并排序

    基本原理

    该算法是采用分治法,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    图解

    稳定性:稳定的

    时间复杂度O(nlogn)

    其他:

    若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。

    若从稳定性来考虑,选择归并排序,堆排序和快速排序都不稳定。

    若从平均情况下的排序速度考虑,应该选择快速排序。

    public class MergeSort {
    	public void mergeSort(int[] a, int left, int right) {
    		if (left < right) {
    			int middle = (left + right) / 2;
    			mergeSort(a, left, middle);
    			mergeSort(a, middle + 1, right);
    			merge(a, left, middle, right);// 合并
    		}
    	}
    
    	private void merge(int[] a, int left, int middle, int right) {
    		int[] tmpArray = new int[a.length];
    		int rightStart = middle + 1;
    		int tmp = left;
    		int third = left; // 表示下标++
    		// 比较两个小数组相应下标位置的数组大小,小的先放进新数组
    		while (left <= middle && rightStart <= right) {
    			if (a[left] <= a[rightStart]) {
    				tmpArray[third++] = a[left++];
    			} else {
    				tmpArray[third++] = a[rightStart++];
    			}
    		}
    		// 如果左边还有数据需要拷贝,把左边数组剩下的拷贝到新数组
    		while (left <= middle) {
    			tmpArray[third++] = a[left++];
    		}
    		// 如果右边还有数据......
    		while (rightStart <= right) {
    			tmpArray[third++] = a[rightStart++];
    		}
           //将数据拷贝到原来的数组中
    		while (tmp <= right) {
    			a[tmp] = tmpArray[tmp++];
    		}
    	}
    
    	public static void main(String[] args) {
    		MergeSort mergeSort = new MergeSort();
    		int[] a = new int[] { 3,5,1,6,4 };
    		mergeSort.mergeSort(a, 0, a.length - 1);
    		for (int n : a) {
    			System.out.print(" " + n);
    		}
    	}
    }
    

      

  • 相关阅读:
    spring4之依赖注入的三种方式
    Hibernate之总结
    Hibernate之dynamic-update
    ThinkPhp调用webservice
    Robot Framework:Web自动化之-元素处理
    Robot Framework:Web自动化之-元素定位
    RobotFramework:python+robotframework+selenium2library测试环境部署说明文档
    Robot Framework:Httplibrary库
    URL备忘
    Windows:CMD命令备忘
  • 原文地址:https://www.cnblogs.com/javabigdata/p/7340603.html
Copyright © 2011-2022 走看看