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

     

  • 相关阅读:
    hdu 5366 简单递推
    hdu 5365 判断正方形
    hdu 3635 并查集
    hdu 4497 数论
    hdu5419 Victor and Toys
    hdu5426 Rikka with Game
    poj2074 Line of Sight
    hdu5425 Rikka with Tree II
    hdu5424 Rikka with Graph II
    poj1009 Edge Detection
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/5578209.html
Copyright © 2011-2022 走看看