归并排序

简介:

采用分治的思想  以O(NlogN)最坏的情形运行时间运行

如果对merge的每个递归调用都采用局部声明一个临时数组,那么在任一时刻就可能有logN个临时数组处在活动期

代码如下:

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 template <typename Comparable>
 5 void mergeSort(vector<Comparable> & a)
 6 {
 7     vector<Comparable> tmpArray(a.size());
 8     mergeSort(a,tmpArray,0,a.size()-1);
 9 }
10 template <typename Comparable>
11 void mergeSort(vector<Comparable> & a,vector<Comparable> & tmpArray,int left,int right)
12 {
13     if(left<right)
14     {
15         int center = (left+right)/2;
16         mergeSort(a,tmpArray,left,center);
17         mergeSort(a,tmpArray,center+1,right);
18         merge(a,tmpArray,left,center+1,right);
19     }
20 }
21 template <typename Comparable>
22 void merge(vector<Comparable> & a,vector<Comparable> & tmpArray,int leftPos,int rightPos,int rightEnd)
23 {
24     int leftEnd = rightPos-1;
25     int tmpPos = leftPos;
26     int numElements = rightEnd - leftPos + 1;
27 
28     while(leftPos <= leftEnd && rightPos <= rightEnd)
29         if(a[leftPos] <= a[rightPos])
30             tmpArray[tmpPos++] = a[leftPos++];
31         else
32             tmpArray[tmpPos++] = a[rightPos++];
33 
34     while(leftPos <= leftEnd)
35         tmpArray[tmpPos++] = a[leftPos++];
36     while(rightPos <= rightEnd)
37         tmpArray[tmpPos++] = a[rightPos++];
38 
39     for(int i=0;i<numElements;i++,rightEnd--)
40         a[rightEnd] = tmpArray[rightEnd];
41 }
42 int main()
43 {
44     vector<int> ivec;
45     ivec.push_back(1);
46     ivec.push_back(9);
47     ivec.push_back(2);
48     ivec.push_back(10);
49     ivec.push_back(3);
50     ivec.push_back(11);
51     ivec.push_back(4);
52     ivec.push_back(12);
53     ivec.push_back(5);
54     ivec.push_back(13);
55     ivec.push_back(6);
56     ivec.push_back(14);
57     ivec.push_back(7);
58     ivec.push_back(15);
59     ivec.push_back(8);
60     ivec.push_back(16);
61     mergeSort(ivec);
62     for(int j = 0;j<ivec.size();j++)
63         cout<<ivec[j]<<endl;
64     return 0;
65 } 
复制代码

运行结果:

本文转自博客园xingoo的博客,原文链接:归并排序,如需转载请自行联系原博主。
相关文章
|
12月前
|
人工智能 BI
归并排序
归并排序。
40 0
|
4月前
|
算法 搜索推荐 Java
归并排序就是这么容易
归并排序就是这么容易
36 2
|
5月前
|
存储 算法 搜索推荐
C++归并排序的实现
C++归并排序的实现
|
5月前
|
搜索推荐
归并排序是什么
归并排序是什么
|
11月前
20 归并排序
20 归并排序
36 0
|
存储 算法 搜索推荐
归并排序(看了就会)
归并排序(看了就会)
|
搜索推荐 算法 C#
C#——归并排序
C#——归并排序
148 0
|
算法
【2. 归并排序】
归并与快排不同: >快速排序: >- 分界点是随机数组里面的一个`数`来分,使得左边都是<= 这个数,右边 >= 这个数 (`数值`) >- 先分完,在分别递归俩边 > >归并排序: >- 先递归俩边,在进行合并操作 >- 分界点是`整个数组中间的位置`(`下标值`)
90 0
【2. 归并排序】
|
算法
归并排序及小和问题(中)
归并排序及小和问题(中)
149 1
归并排序及小和问题(中)