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路

    四、三路归并排序

  • 相关阅读:
    只要7步,就能将任何魔方6面还原
    写一篇文章测试一下
    关于80端口被占用
    打造只能输入数字的文本框
    windows下MySql忘记密码的解决方案
    linq to xml 操作sitemap
    C#设计模式——工厂方法模式(Factory Method Pattern)
    C#设计模式——单件模式(Singleton Pattern)
    C#设计模式——迭代器模式(Iterator Pattern)
    C#设计模式——状态模式(State Pattern)
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12312312.html
Copyright © 2011-2022 走看看