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、堆排序

     

  • 相关阅读:
    软考倒计时2天
    案例分析
    冒泡排序
    二分查找
    MySQL 错误 1366:1366 Incorrect integer value
    linux(centos) 添加系统环境变量
    php的opcache缓存扩展
    启动mysqld报 mysql the server quit without updating pid file
    mysql5.5 报Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
    关于git CRLF LF结尾的问题
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/5578209.html
Copyright © 2011-2022 走看看