zoukankan      html  css  js  c++  java
  • 数据结构之归并排序

    • 归并排序

           是利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成为越来越大的有序序列。例如数组:[2,6,1,0],会先折半,分为[2,6]和[1,0]两个数组,然后再折半将数组分离,分为[2]、[6]和[1]、[0]。然后,再将[2]、[6]合并到一个数组中是[2,6],[1]、[0]合并到一个数组中是[0,1]。最后再将[2,6]和[0,1]合并到一个数组中,即为[0,1,2,6]。

    • 基本原理

           对于给定的一组记录(假设有n个记录),首先将每两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。

    • 程序如下
    public class Test{
        public static void sort(int[] a, int low, int high){
             int mid = (low+high)/2;
             if(low<high){
                 sort(a, low, mid);      //左边
                 sort(a, mid+1, high);   //右边
                 merge(a, low, mid, high);   //左右归并
             }
        }
        public static void merge(int[] a, int low, int mid, int high){
             int[] b = new int[high-low+1];
             int i = low, j = mid+1, k = 0;   //i为左指针,j为右指针
    //把较小的数先移到新数组中
    while(i<=mid && j<=high){ if(a[i] < a[j]){ b[k++] = a[i++]; } else{ b[k++] = a[j++]; } }
    //把左边剩余的数移入数组
    while(i<=mid){ b[k++] = a[i++]; }
    //把右边剩余的数移入数组
    while(j<=high){ b[k++] = a[j++]; }
    //把新数组中的数覆盖a数组
    for(int m=0;m<b.length;m++){ a[m+low] = b[m]; } } public static void main(String[] args) { int[] a = {7,6,4,8,9,3,2}; sort(a,0,a.length-1); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } }

           程序结果

    • 算法分析
    1. 最好时间:O(nlogn)
    2. 平均时间:O(nlogn)
    3. 最坏时间:O(nlogn)
    4. 辅助存储:O(n)
    5. 稳定性:稳定
  • 相关阅读:
    自己奋斗才有用,人要坚持到成功为止
    自己需要的都是靠自己争取,人生只有自己才靠得住
    不如意也是要过日子,人是不可能和天斗的
    懂得满足也是好的,人要学会知足才会感到幸福
    不要让自己有后悔的时候,人都是要不负自己的青春年少
    ES6 の 块级作用域
    javascript中this的指向分析
    let & var 的区别
    npm 全局安装环境配置
    visibilitychange => 获取页面的可见性
  • 原文地址:https://www.cnblogs.com/jiqianqian/p/6628559.html
Copyright © 2011-2022 走看看