码迷,mamicode.com
首页 > 编程语言 > 详细

时间复杂度为O(N*logN)的排序算法——归并排序、快速排序、堆排序

时间:2016-06-12 18:22:32      阅读:452      评论:0      收藏:0      [点我收藏+]

标签:

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

 

时间复杂度为O(N*logN)的排序算法——归并排序、快速排序、堆排序

标签:

原文地址:http://www.cnblogs.com/timesdaughter/p/5578209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!