-------------------------------------
典型例题 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-----------------------
数据结构问题---内部排序
最新推荐文章于 2022-12-14 08:00:00 发布