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

    一、O(nlogN)和 O(n^2)的时间效率对比

    二、归并排序的实现过程

        过程:分组,组内排序

       法一:递归实现

    
    

    //将arr[l...mid]和arr[mid+1...r]两部分进行归并
    template<typename T>
    void __merge(T arr[],int l,int mid,int r){
    //1.已知两个有序的数组,想变成一个有序的数组,并且希望时间复杂度是O(n)
    //2.这是一个比较困难的事,但是可以通过空间置换,
    //step1:复制数组,两个相同数组,三个指标:k最终指向的位置,i,j分别指向两个有序数组的第一个
    // 2:对比i,j的大小,小的复制到k

    //复制数组
    T aux[r-l+1];
    for(int i = l;i<=r;i++){
    aux[i-l] = arr[i];
    }

    int i = l,j = mid + 1;
    for(int k = l; k <= r; k++){
    //防止越界
    if(i > mid){
    arr[k] = aux[j-l];
    j++;
    }else if(j > r ){
    arr[k] = aux[i-l];
    }else if(aux[i-l] < aux[j-l]){
    arr[k] = aux[i-l];
    i++;
    }else{
    arr[k] = aux[j-l];
    j++;
    }

    }
    }

    
    

    //递归使用归并排序,对 arr[l...r]进行排序
    template<typename T>
    void __mergeSort(T arr[],int l,int r){
    if(l > r){
    return;
    }
    //***优化2:如果数量级较小的情况下,因为前面的系数,归并算法有递归损失,插入算法反而更有效
    if(r-l <= 15){
    insertSort(arr,l,r);
    return;
    }

    int mid = (l + r)/2;
    __mergeSort(arr,l,mid);
    __mergeSort(arr,mid+1,r);
    //***优化1:
    if(arr[mid] > arr[mid+1]){
    __merge(arr,l,mid,r);
    }

    }

    
    

    template<typename T>
    void mergetSort(T arr[],int n){
    __mergeSort(arr,0,n);
    }

    实现过程:归并排序算法有两个基本的操作,一个是,也就是把原数组划分成两个子数组的过程。另一个是,它将两个有序数组合并成一个更大的有序数组。

    三、自下向上-2路

    四、三路归并排序

  • 相关阅读:
    PHP htmlspecialchars和htmlspecialchars_decode(函数)
    使用CURL抓取淘宝页面
    PHP 自定义字符串中的变量名解析
    Notepad++前端开发常用插件介绍
    使用phpExcel实现Excel数据的导入导出(完全步骤)
    moment.js 日期包装类 (说明示例)
    php函数前面加&符号 和 变量前面加&符号的意义
    window 查看端口/杀进程
    eureka 去除注册中心保护机制
    mysql 表关联更新另一张表的数据
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12312312.html
Copyright © 2011-2022 走看看