IceSandwich

优先级排序

不是什么新颖的排序

字数统计: 402阅读时长: 1 min
2020/07/13 Share

前言

优先级排序是根据优先级对数组进行排序而非对数组的值排序,这不是什么新颖的排序。

比如:数组A = { 1, 2, 3, 4 },优先级P = { 36, 3, 62, 19 };优先级越小就排在越前面,比如优先级中3最小,对应的数字是2,则2排在最前面。优先级中第二小是19,对应的数字是4,因此排序后第二个元素为4。依此类推,得到排序 { 2, 4, 1, 3 }。

方法一 vector+pair组合排序

注意的是vector排序是按照pair的first排序的,因此我们要将优先级放到first,将值放到second,让std::sort顺手牵羊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int n = 4;
int A[n] = { 1, 2, 3, 4 };
int P[n] = { 36, 3, 62, 19 };

int main() {
vector< pair<int, int> > table;
for (int i = 0; i < n; ++i) {
table.push_back(make_pair(P[i], A[i])); //注意优先级在先,值在后
}
sort(table.begin(), table.end());
for (int i = 0; i < n; ++i) {
printf("%d ", table[i].second);
}
return 0;
}

方法二 改写比较函数

写class或者struct,重写比较运算符。

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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int n = 4;
int A[n] = { 1, 2, 3, 4 };
int P[n] = { 36, 3, 62, 19 };

int main() {
struct PermutePair {
int a, p;
bool operator< (PermutePair &pp) {
return p<pp.p;
}
} table[n];
for (int i = 0; i < n; ++i) {
table[i].a = A[i];
table[i].p = P[i];
}
sort(table, table+n);
for (int i = 0; i < n; ++i) {
printf("%d ", table[i].a);
}
return 0;
}
CATALOG
  1. 1. 前言
  2. 2. 方法一 vector+pair组合排序
  3. 3. 方法二 改写比较函数