C++模板类归并排序

Posted by Harid二月 - 28 - 2011 Leave comments   183 views 

合并排序是一种外排序算法,其运行时间为O(nlgn),在最坏的情况下要比插入排序O(n²)好。

合并排序步骤:

分解:将n个元素分成各含n/2个元素的子序列;

解决:用合并的排序法对两个子序列递归地排序;

合并:合并两个已排序的子序列以得到排序结果。

在对子序列排序时,其长度为 1 时递归结束。具体思路参考《算法导论》P17页内容。

下面是C++的具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//: mergeSort.h
/* Author: Kailash
*  Contact: http://www.ninthday.net
*/
#ifndef MERGESORT_H_
#define MERGESORT_H_
#include <iostream>
template <class Type>
class MergeSort
{
private:
    Type* m_head;
    int m_length;
protected:
    void merge(Type* array, int start, int middle, int end);
    void mergeSort(Type* array, int start, int end);
public:
    MergeSort(Type* array, int length);
    MergeSort(Type* array, int length, int start, int end);
    void show();
    Type* getHead(){
        return this->m_head; }
    int getLength(){
        return this->m_length; }
};
template <class Type>
MergeSort<Type>::MergeSort(Type* array, int length)
{
    m_head = array;
    m_length = length;
    mergeSort(array, 0, length-1);
}
template <class Type>
MergeSort<Type>::MergeSort(Type* array, int length, int start, int end)
{
    m_head = array;
    m_length = length;
    mergeSort(m_head, start-1, end-1);
}
template <class Type>
void MergeSort<Type>::merge(Type* array, int start, int middle, int end)
{
    int n1 = middle-start+1;
    int n2 = end-middle;
    int* left = new Type[n1+2];
    int* right = new Type[n2+2];
    int i, j;
    for(i=0; i<n1; i++)
        left[i] = array[start+i];
    for(j=0; j<n2; j++)
        right[j] = array[middle+j+1];
    left[n1] = 30000;
    right[n2] = 30000;
    left[n1+1] = '\0';
    right[n2+1] = '\0';
    i = j = 0;
    for(int k=start; k<=end; k++)
    {
        if(left[i]<=right[j])
        {
            array[k] = left[i];
            i += 1;
        }
        else
        {
            array[k] = right[j];
            j += 1;
        }
    }
    delete [] left;
    delete [] right;
}
template <class Type>
void MergeSort<Type>::mergeSort(Type* array, int start, int end)
{
    if(start<end)
    {
        int middle = (start+end)/2;
        mergeSort(array, start, middle);
        mergeSort(array, middle+1, end);
        merge(array, start, middle, end);
    }
}
template <class Type>
void MergeSort<Type>::show()
{
    using namespace std;
    cout <<endl;
    for(int i=0;i<m_length;i++)
        cout <<m_head[i]<<" ";
    cout <<endl;
}
#endif

   声明:本文采用 BY-NC-SA 协议进行授权 | 星期九
   原创文章转载请注明:转自《C++模板类归并排序

分享本文: 腾讯微博 QQ空间 人人网 百度空间 开心网 新浪微博 Google Reader 豆瓣
Comments(10) Leave comments
  1. Gravatar
    HaoziLeung Mozilla Firefox Mozilla Firefox 10.0.1 Linux Linux

    嗯,很经典的算法

  2. Gravatar
    第二纪元 Internet Explorer Internet Explorer 8.0 Windows Windows 7

    过来看看 !

  3. Gravatar
    魂牵梦萦、遇见你 Mozilla Firefox Mozilla Firefox 3.6.13 Windows Windows XP

    :evil: 再来一脚 :wink:

  4. Gravatar
    Suitear Google Chrome Google Chrome 9.0.597.98 Windows Windows XP

    好吧~我对此无感觉~

    • Gravatar Harid  @  三月 1st, 2011 at 19:18 replied.

      @Suitear, :grin: ,你的博客还是访问不了。

  5. Gravatar
    混乱博客 Google Chrome Google Chrome 9.0.597.98 Windows Windows 7

    问个问题...object c和c++相同吗?

    • Gravatar Harid  @  三月 1st, 2011 at 19:13 replied.

      @混乱博客, Objective-C不支持多重继承,而C++语言支持多重继承。Objective-C是动态定型,所以它的类库比C++要容易操作。它是Mac OS上用的开发语言。具体我也不清楚。

  6. Gravatar
    小羿 Google Chrome Google Chrome 8.0.552.237 Windows Windows 7

    C++ 神马的都忘记了

6 + 3 =  (required)
 疑问 鼓掌 难过 呲牙 强 微笑 快哭了 坏笑 汗 奋斗 撇嘴 OK 偷笑 委屈 尴尬 傲慢 握手 玫瑰 胜利 大哭 抱拳
启用云输入法:      

NOTICE1: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!

NOTICE2: 请申请gravatar头像(http://en.gravatar.com),木有头像的会显示为“小怪物”头像,将难以通过审核!

NOTICE3: 如果您能消除一下评论框旁边的邻居的寂寞的话,Harid将不胜感激,你懂的!^_^