数据结构问题---内部排序

-------------------------------------
典型例题 20:数据结构问题---内部排序。
-------------------------------------
 1    #include <iostream>
 2   
 3    using namespace std;
 4   
 5    template <class T>
 6    void InsertSort(T a[], int N)
 7    {
 8        int i,j;
 9        for (i = 2; i <= N; ++i)
10            if(a[i]<a[i-1])
11                {
12                    a[0] = a[i];
13                    a[i] = a[i-1];
14                    for (j = i-2; a[0] < a[j];--j)
15                        {
16                            a[j+1] = a[j];
17                        }
18                    a[j+1] = a[0];
19                }
20    }
21   
22    //-------------------------------------
23    template<class T>
24    void BinaryInsertSort(T a[], int N)
25    {
26        int i,j;
27        for (i = 2; i <= N; i++)
28            {
29                a[0] = a[i];
30                int low = 1, high = i - 1;
31                while (low <= high)//折半查找
32                    {
33                        int mid = (low + high) / 2;
34                        if (a[0] < a[mid])
35                            high = mid - 1;
36                        else
37                            low = mid + 1;
38                    }
39                for (j = i - 1; j >= low; --j)
40                    {
41                        a[j + 1] = a[j];
42                    }//记录后移
43                a[low] = a[0];//插入
44            }
45    }
46   
47    //-------------------------------------
48    template <class T>
49    void ShellSort(T a[], int N)
50    {
51        int i,j,gap;
52        for (gap = N/2; gap; gap = gap/2)
53            {
54                for (i = gap+1; i <= N; i++)
55                    if(a[i] < a[i-gap]){
56                        a[0] = a[i];
57                        for (j = i-gap; j >0; j -= gap)
58                            {
59                                a[j+gap] = a[j];
60                            }
61                        a[j+gap] = a[0];
62                    }
63            }
64    }
65     
66    //-------------------------------------
67    template <class T>
68    void BubbleSort(T a[], int N)
69    {
70        int i,j;
71        bool exchange = true;
72        for (i = N; i>=1 && exchange; --i)
73            {
74                exchange = false;
75                for (j = 1; j <i; ++j)
76                    {
77                        if (a[j] < a[j+1])
78                            {
79                                swap(a[j], a[j+1]);
80                                exchange = true;
81                            }
82                    }
83            }
84    }
85    //-------------------------------------
86   
87    template <class T>
88    int Partition(T a[], int left, int right)
89    {
90        int i;
91        int pivotpos = left;
92        a[0] = a[left];//枢轴
93   
94        for (i = left + 1; i <= right; ++i)
95            if (a[i] < a[0] && ++pivotpos != i)
96                {
97                    swap(a[i], a[pivotpos]);
98                }
99        swap(a[left], a[pivotpos]);
100   
101        return pivotpos;
102    }
103     
104    template <class T>
105    void QSRecurve(T a[], int left, int right)
106    {
107        if (left < right)
108            {
109                int pivotpos = Partition<T>(a, left, right);
110                QSRecurve<T>(a, left, pivotpos - 1);
111                QSRecurve<T>(a, pivotpos + 1, right);
112            }
113    }
114   
115    template <class T>
116    void QuickSort(T a[], int N)
117    {
118        QSRecurve<T>(a, 1, N);
119    }
120     
121    //-------------------------------------
122    template <class T>
123    void SelectSort(T a[], int N)
124    {
125        int j,i;
126        int k;
127        for (i = 1; i <= N; i++)
128            {
129                for (j = i + 1, k = i; j <= N; j++)
130                    if (a[j] < a[k]) k = j;//select min
131   
132                if (k != i)
133                    {
134                        swap(a[k], a[i]);
135                    }
136            }
137    }
138    //-------------------------------------
139    template <class T>
140    void FilterDown(T a[], int i, int N)
141    {
142        int child = 2 * i ;
143        T temp = a[i];
144        for(child = 2*i;child <= N ;child *= 2)
145            {
146                //沿着值较大的孩子的结点向下筛选
147                if (child < N  && a[child] < a[child+1]) ++child;
148                if (temp >= a[child]) break;//不需调整,结束调整
149                a[i] = a[child];
150                i = child;
151            }
152        a[i] = temp;
153    }
154   
155    template <class T>
156    void HeapSort(T a[], int N)
157    {
158        int i;
159        int k;
160        for (i = N/2; i > 0; --i) FilterDown<T>(a, i, N);//生成最大堆
161        for (i = N; i >= 1; i--)
162            {
163                swap(a[1], a[i]);
164                FilterDown(a, 1, i-1);
165            }
166    }
167    //------------------------------------
//-----------sort_alll.cc----------------------
 1    #include <iostream>
 2    #include <iomanip>
 3    #include <cstdlib>
 4    #include <ctime>
 5    #include <cmath>
 6    #include "msort.h"
 7   
 8    using namespace std;
 9   
10    #define random(num) (rand() % (num))
11    #define randomize() srand((unsigned)time(NULL))
12   
13    #define N 21 //排序元素的数目
14    //#define SORT InsertSort //排序方法
15    //#define SORT BinaryInsertSort
16    //#define SORT TableInsertSort
17    //#define SORT BubbleSort
18    //#define SORT ShellSort
19    //#define SORT QuickSort
20    #define SORT HeapSort
21    //#define SORT SelectSort
22   
23    class timer//单位ms
24    {
25    public:
26        void start() { start_t = clock(); }
27        clock_t time() { return (clock() - start_t); }
28    private:
29        clock_t start_t;
30    };
31   
32    int KCN, RMN; timer TIMER;
33    void test(int a[])
34    {
35        int i;
36       
37        cout<<endl;
38        cout<<"---Before Sort:"<<endl;
39       
40        for(i = 1;i<=N;++i)
41            {
42                cout<<a[i]<<" ";
43            }
44        cout<<endl;
45       
46        TIMER.start();
47        SORT<int>(a, N);
48       
49        cout<<"---After Sort:"<<endl;
50        for(i = 1;i<=N;++i)
51            {
52                cout<<a[i]<<" ";
53            }
54        cout<<endl;
55       
56        cout<<"---Spend time:"<<TIMER.time()<<endl;
57   
58    }
59    int main()
60    {
61        int i;
62        //randomize();为了在相同情况下比较各个排序算法,不加这句
63        int* ascending = new int[N+1];//升序序列
64        int* descending = new int[N+1];//降序序列
65        int* randomness = new int[N+1];//随机序列
66   
67        for (i = 1; i <= N; ++i)
68            {
69                ascending[i] = i;
70                randomness[i] = i;
71                descending[i] = N - i - 1;
72            }
73        for (i = 1; i <= N; ++i)
74            swap(randomness[i], randomness[random(N)]);
75       
76           cout << "Sort ascending N=" << N; test(ascending);
77           cout << "Sort randomness N=" << N; test(randomness);
78           cout << "Sort descending N=" << N; test(descending);
79   
80        delete[] ascending;
81        delete[] descending;
82        delete[] randomness;
83        return 0;
84    }
//-----------sort_alll.cc-----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值