zoukankan      html  css  js  c++  java
  • 时间复杂度为O(N*logN)的排序算法——归并排序、快速排序、堆排序

    1、归并排序

     1 void mergeSort(vector<int>& nums,int start,int end){
     2         if(start<end){
     3              int q = (start+end)/2;
     4              mergeSort(nums,start,q);
     5              mergeSort(nums,q+1,end);
     6              merge(nums,start,q,end);
     7         }
     8     }
     9 void merge(vector<int>& nums,int start,int q,int end){
    10         vector<int> L1(q-start+1,0);
    11         vector<int> L2(end-q,0);
    12         L1.assign(nums.begin()+start,nums.begin()+q+1);
    13         L2.assign(nums.begin()+q+1,nums.begin()+end+1);
    14         int i=0,j=0;
    15         for(int k = start;k<=end;k++){
    16             if(L1[i] <= L2[j]){
    17                 nums[k] = L1[i];
    18                 i++;
    19             }else{
    20                 nums[k] = L2[j];
    21                 j++;
    22             }
    23             if(i>L1.size()-1){
    24                 for(int s = k+1;s<=end;s++){
    25                     nums[s] = L2[j];
    26                     j++;
    27                 }
    28                 break;
    29             }
    30             if(j>L2.size()-1){
    31                 for(int s = k+1;s<=end;s++){
    32                     nums[s] = L1[i];
    33                     i++;
    34                 }
    35                 break;
    36             }
    37         }
    38     }

    使用分治法,先将元素拆分成最小的形式,然后两两合并。每次合并是将两个已经排好序的子数组进行合并。

    但在进行数组合并时,需要将其拷贝到新申请的数组中,拷贝过程花费时间和额外的内存开销。

    2、快速排序

     void quickSort(vector<int>& nums,int start,int end){
             int pivot;
             if(start<end){
                 pivot = randPartition(nums,start,end);
                 quickSort(nums,start,pivot-1);
                 quickSort(nums,pivot+1,end);
             }
         }
      int randPartition(vector<int>& nums,int start ,int end){
             int randi = start;
             std::swap(nums[randi],nums[start]);
             int pivot = nums[start];
             int i = start;
             for(int j = start+1;j<=end;j++){
                    if(nums[j]<pivot){
                        i++;
                        swap(nums[i],nums[j]);
                    }
                }
                swap(nums[start],nums[i]);
                return i;
            }

    随机快速排序不需要额外申请内存空间,随机选取pivot对数组进行划分,使左边元素小于pivot,右边元素大于pivot。然后分别对左右子数组调用快速排序算法重新划分。最坏情况下可能出现O(N*N)的情况,但出现可能性很小。

    3、堆排序

     

  • 相关阅读:
    前端跨域整理
    URL HTML 统一资源定位器(Uniform Resource Locators)
    css属性选择器*=,|=,^=,$=,*=的区别
    JavaScript运算符 ~,~~,|,&,&&
    js获取url参数值的几种方式
    vue 常用插件集合(最全)
    Echarts曲线设置多条X轴和Y轴
    vue中引入.svg图标,使用iconfont图标库(SvgIcon组件使用)
    采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
    VS如何设置类或函数前不显示引用的数量
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/5578209.html
Copyright © 2011-2022 走看看