标签:
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 }
使用分治法,先将元素拆分成最小的形式,然后两两合并。每次合并是将两个已经排好序的子数组进行合并。
但在进行数组合并时,需要将其拷贝到新申请的数组中,拷贝过程花费时间和额外的内存开销。
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)的情况,但出现可能性很小。
时间复杂度为O(N*logN)的排序算法——归并排序、快速排序、堆排序
标签:
原文地址:http://www.cnblogs.com/timesdaughter/p/5578209.html