权重结构的加权排序算法
开始算法之前,首先介绍一下向量中的排序方式,这里使用的是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(), vec.end(), _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; return 0; }
正面代码段时对vec中的_sortStru<int>成员,按照结构体中第一个成员进行排序。
下面给出的是对这个的加权排序
每一个结构体的成员都有一个自己的权重,结构体的定义如下:
//定义加权排序的结构 template<typename T> struct _sortStru { T _data1; 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) 6 using namespace std; 7 #define MAXNUM 10 8 9 //定义加权排序的结构 10 template<typename T> 11 struct _sortStru 12 { 13 T _data1; 14 T _data2; 15 T _data3; 16 T _data4; 17 int nWeight[4]; 18 _sortStru() 19 { 20 memset(this, 0, sizeof(_sortStru)); 21 } 22 }; 23 24 25 bool _sort_sample(const _sortStru<int> &l, const _sortStru<int> &r) 26 { 27 return l._data1 < r._data1; 28 } 29 30 31 class _sort 32 { 33 public: 34 _sort() : pos(0){} 35 _sort(int nPos) : pos(nPos){} 36 bool operator()(const _sortStru<int> &l, const _sortStru<int> &r) 37 { 38 switch (pos) 39 { 40 case 0: 41 return l._data1 < r._data1; 42 case 1: 43 return l._data2 < r._data2; 44 case 2: 45 return l._data3 < r._data3; 46 case 3: 47 return l._data4 < r._data4; 48 default: 49 return l._data1 < r._data1; 50 } 51 } 52 53 private: 54 int pos; 55 }; 56 57 template<class T> 58 class Add_Weight 59 { 60 public: 61 Add_Weight(int type, int start) 62 : ntype(type), nstart(start), nLastValue(0), nLastWeight(0) 63 { 64 } 65 66 void operator()(_sortStru<T> &_F) 67 { 68 switch (ntype) 69 { 70 case 0: default: 71 if (_F._data1 == nLastValue) 72 { 73 _F.nWeight[ntype] = nLastWeight; 74 } 75 else 76 { 77 _F.nWeight[ntype] = nstart; 78 nLastValue = _F._data1; 79 nLastWeight = nstart; 80 } 81 break; 82 case 1: 83 if (_F._data2 == nLastValue) 84 { 85 _F.nWeight[ntype] = nLastWeight; 86 } 87 else 88 { 89 _F.nWeight[ntype] = nstart; 90 nLastValue = _F._data2; 91 nLastWeight = nstart; 92 } 93 break; 94 case 2: 95 if (_F._data3 == nLastValue) 96 { 97 _F.nWeight[ntype] = nLastWeight; 98 } 99 else 100 { 101 _F.nWeight[ntype] = nstart; 102 nLastValue = _F._data3; 103 nLastWeight = nstart; 104 } 105 break; 106 case 3: 107 if (_F._data4 == nLastValue) 108 { 109 _F.nWeight[ntype] = nLastWeight; 110 } 111 else 112 { 113 _F.nWeight[ntype] = nstart; 114 nLastValue = _F._data4; 115 nLastWeight = nstart; 116 } 117 break; 118 } 119 nstart++; 120 } 121 private: 122 int ntype; 123 int nstart; 124 T nLastValue; 125 int nLastWeight; 126 }; 127 128 129 130 // 四个参数的权重类 131 class CWeight 132 { 133 public: 134 CWeight() 135 { 136 weight_1 = 0; 137 weight_1 = 0; 138 weight_1 = 0; 139 weight_1 = 0; 140 }; 141 142 CWeight(int Fir, int Sec, int thi, int Fou) 143 : weight_1(Fir), weight_2(Sec), weight_3(thi), weight_4(Fou) 144 { 145 }; 146 147 void Check() 148 { 149 assert(weight_1 + weight_2 + weight_3 + weight_4 == 100); 150 } 151 152 public: 153 int weight_1; 154 int weight_2; 155 int weight_3; 156 int weight_4; 157 }; 158 159 template<class T> 160 class Compare_Weight 161 { 162 public: 163 Compare_Weight(CWeight *pF) 164 : pweight(pF) 165 { 166 } 167 168 bool 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 180 return t1 > t2; 181 } 182 183 private: 184 CWeight *pweight; 185 }; 186 187 int main() 188 { 189 // 初始化一个vector,成员类型为_sortStru<int> 190 vector< _sortStru<int> > vec; 191 int i = 0; 192 for (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 // 输出 203 for (i = 0; i < MAXNUM; i++) 204 { 205 _sortStru<int> out; 206 out = 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(), vec.end(), _sort_sample); 214 for (i = 0; i < MAXNUM; i++) 215 { 216 _sortStru<int> out; 217 out = 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(), vec.end(), _sort(2)); 225 for (i = 0; i < MAXNUM; i++) 226 { 227 _sortStru<int> out; 228 out = vec.at(i); 229 cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" "; 230 cout<<endl; 231 } 232 cout<<endl; 233 234 // 加权排序 235 for (i = 0; i < 4; i++) 236 { 237 std::sort(vec.begin(), vec.end(), _sort(i)); 238 std::for_each(vec.begin(), vec.end(), Add_Weight<int>(i, 0)); 239 } 240 CWeight *weight = new CWeight(50, 50, 0, 0); 241 weight->Check(); 242 std::sort(vec.begin(), vec.end(), Compare_Weight<int>(weight)); 243 for (i = 0; i < MAXNUM; i++) 244 { 245 _sortStru<int> out; 246 out = vec.at(i); 247 cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" "; 248 cout<<endl; 249 } 250 cout<<endl; 251 252 return 0; 253 }
时间: 2024-11-13 06:39:14