权重结构的加权排序算法
权重结构的加权排序算法
开始算法之前,⾸先介绍⼀下向量中的排序⽅式,这⾥使⽤的是STL中的std::sort排序⽅式,具体使⽤的代码如下://定义加权排序的结构
template<typename T>
struct _sortStru
{
T _data1;
T _data2;
T _data3;
T _data4;
int nWeight[4];
_sortStru()
{
memset(this, 0, sizeof(_sortStru));
}
};
bool _sort_sample(const _sortStru<int> &l, const _sortStru<int> &r)
{
return l._data1 < r._data1;
}
int main()
{
/
/ 初始化⼀个vector,成员类型为_sortStru<int>
vector< _sortStru<int> > vec;
int i = 0;
for (i = 0; i < MAXNUM; i++)
{
_sortStru<int> sort;
sort._data1 = Random();
sort._data2 = Random();
sort._data3 = Random();
sort._data4 = Random();
vec.push_back(sort);
}
// 输出
for (i = 0; i < MAXNUM; i++)
{
_sortStru<int> out;
out = vec.at(i);
cout<< out._data1<<""<<out._data2<<""<<out._data3<<""<<out._data4<<"";
cout<<endl;
}
cout<<endl;
// 简单排序,最结构体中的第⼀个成员进⾏排序
std::sort(vec.begin(), d(), _sort_sample);
for (i = 0; i < MAXNUM; i++)
{
_sortStru<int> out;
out = vec.at(i);
cout<< out._data1<<""<<out._data2<<""<<out._data3<<""<<out._data4<<"";
cout<<endl;
}
cout<<endl;
return0;
}
正⾯代码段时对vec中的_sortStru<int>成员,按照结构体中第⼀个成员进⾏排序。
下⾯给出的是对这个的加权排序
每⼀个结构体的成员都有⼀个⾃⼰的权重,结构体的定义如下:
//定义加权排序的结构
template<typename T>
struct _sortStru
T _data2;
T _data3;
T _data4;
int nWeight[4];
_sortStru()
{
memset(this, 0, sizeof(_sortStru));
}
};
在这个结构中有四个成员变量,分别任_data1 - _data4,这个四个成员都有⾃⼰的权重,⽐如_data1的权重是30,_data2的权重是20,_data3的权重是40,_data4的权重是10。然后根据这些权重对⼀组数据进⾏排序。然后将排序后的结果从⼤到⼩排列出来。
具体的排序⽅法是:
⾸先,对这组数据中的每个成员从⼩到⼤排序,具体的先对第⼀个成员进⾏从⼩到⼤排序,排好序后给这些成员添加上⾃⼰的位置权重,最⼩的为0,然后依次增加,循环的给所有的成员都添加上位置权重。
然后,对这些具有位置权重的数据进⾏加权排序。
具体代码如下:
1 #include <iostream>
2 #include <vector>
3 #include <assert.h>
4 #include <algorithm>
5#define Random() (rand()%100)
6using namespace std;
7#define MAXNUM 10
8
9//定义加权排序的结构
10 template<typename T>
11struct _sortStru
12 {
13 T _data1;
14 T _data2;
15 T _data3;
16 T _data4;
17int nWeight[4];
18 _sortStru()
19 {
20 memset(this, 0, sizeof(_sortStru));
21 }
22 };
23
24
25bool _sort_sample(const _sortStru<int> &l, const _sortStru<int> &r)
26 {
27return l._data1 < r._data1;
28 }
29
30
31class _sort
32 {
33public:
34 _sort() : pos(0){}
35 _sort(int nPos) : pos(nPos){}
36bool operator()(const _sortStru<int> &l, const _sortStru<int> &r)
37 {
38switch (pos)
39 {
40case0:
41return l._data1 < r._data1;
42case1:
43return l._data2 < r._data2;
44case2:
45return l._data3 < r._data3;
46case3:
47return l._data4 < r._data4;
48default:
49return l._data1 < r._data1;
50 }
51 }
52
53private:
54int pos;
55 };
56
57 template<class T>
58class Add_Weight
61 Add_Weight(int type, int start)
62 : ntype(type), nstart(start), nLastValue(0), nLastWeight(0)
63 {
64 }
65
66void operator()(_sortStru<T> &_F)
67 {
68switch (ntype)
69 {
70case0: default:
71if (_F._data1 == nLastValue)
72 {
73 _F.nWeight[ntype] = nLastWeight;
74 }
75else
76 {
77 _F.nWeight[ntype] = nstart;
78 nLastValue = _F._data1;
79 nLastWeight = nstart;
80 }
81break;
82case1:
83if (_F._data2 == nLastValue)
84 {
85 _F.nWeight[ntype] = nLastWeight;
86 }
87else
88 {
89 _F.nWeight[ntype] = nstart;
90 nLastValue = _F._data2;
91 nLastWeight = nstart;
92 }
93break;
94case2:
95if (_F._data3 == nLastValue)
96 {
97 _F.nWeight[ntype] = nLastWeight;
98 }
99else
100 {
101 _F.nWeight[ntype] = nstart;
102 nLastValue = _F._data3;
103 nLastWeight = nstart;
104 }
105break;
106case3:
107if (_F._data4 == nLastValue)
108 {
109 _F.nWeight[ntype] = nLastWeight;
110 }
111else
112 {
113 _F.nWeight[ntype] = nstart;
114 nLastValue = _F._data4;
115 nLastWeight = nstart;
116 }
117break;
118 }
119 nstart++;
120 }
121private:
122int ntype;
123int nstart;
124 T nLastValue;
125int nLastWeight;
126 };
127
128
129
130// 四个参数的权重类
131class CWeight
132 {
133public:
134 CWeight()
135 {
136 weight_1 = 0;
137 weight_1 = 0;
138 weight_1 = 0;
139 weight_1 = 0;
140 };
141
145 };
146
147void Check()
148 {
149 assert(weight_1 + weight_2 + weight_3 + weight_4 == 100);
150 }
151
152public:
153int weight_1;
154int weight_2;
155int weight_3;
156int weight_4;
157 };
158
159 template<class T>
160class Compare_Weight
161 {
162public:
163 Compare_Weight(CWeight *pF)
164 : pweight(pF)
165 {
166 }
167
168bool operator()(const _sortStru<T> &_F, const _sortStru<T> &_L)
169 {
170 T t1 = _F.nWeight[0] * pweight->weight_1
171 + _F.nWeight[1] * pweight->weight_2
172 + _F.nWeight[2] * pweight->weight_3
173 + _F.nWeight[3] * pweight->weight_4;
174
175 T t2 = _L.nWeight[0] * pweight->weight_1
176 + _L.nWeight[1] * pweight->weight_2
177 + _L.nWeight[2] * pweight->weight_3
178 + _L.nWeight[3] * pweight->weight_4;
179
180return t1 > t2;
181 }
182
183private:
184 CWeight *pweight;
185 };
结构体sizeof186
187int main()
188 {
189// 初始化⼀个vector,成员类型为_sortStru<int>
190 vector< _sortStru<int> > vec;
191int i = 0;
192for (i = 0; i < MAXNUM; i++)
193 {
194 _sortStru<int> sort;
195 sort._data1 = Random();
196 sort._data2 = Random();
197 sort._data3 = Random();
198 sort._data4 = Random();
199 vec.push_back(sort);
200 }
201
202// 输出
203for (i = 0; i < MAXNUM; i++)
204 {
205 _sortStru<int> out;
206out = vec.at(i);
207 cout<< out._data1<<""<<out._data2<<""<<out._data3<<""<<out._data4<<""; 208 cout<<endl;
209 }
210 cout<<endl;
211
212// 简单排序,最结构体中的第⼀个成员进⾏排序
213 std::sort(vec.begin(), d(), _sort_sample);
214for (i = 0; i < MAXNUM; i++)
215 {
216 _sortStru<int> out;
217out = vec.at(i);
218 cout<< out._data1<<""<<out._data2<<""<<out._data3<<""<<out._data4<<""; 219 cout<<endl;
220 }
221 cout<<endl;
222
223// 简单排序,最结构体中的第N个成员进⾏排序
224 std::sort(vec.begin(), d(), _sort(2));
225for (i = 0; i < MAXNUM; i++)
228out = vec.at(i);
229 cout<< out._data1<<""<<out._data2<<""<<out._data3<<""<<out._data4<<""; 230 cout<<endl;
231 }
232 cout<<endl;
233
234// 加权排序
235for (i = 0; i < 4; i++)
236 {
237 std::sort(vec.begin(), d(), _sort(i));
238 std::for_each(vec.begin(), d(), Add_Weight<int>(i, 0));
239 }
240 CWeight *weight = new CWeight(50, 50, 0, 0);
241 weight->Check();
242 std::sort(vec.begin(), d(), Compare_Weight<int>(weight));
243for (i = 0; i < MAXNUM; i++)
244 {
245 _sortStru<int> out;
246out = vec.at(i);
247 cout<< out._data1<<""<<out._data2<<""<<out._data3<<""<<out._data4<<""; 248 cout<<endl;
249 }
250 cout<<endl;
251
252return0;
253 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论