排序方法及应用
C++实现自定义排序
使用算法头文件中的 sort
举例 对结构体进行排序,自定义排序
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cstdio>
using namespace std;
const int n = 3;
class Person {
public:
string n; int s;
Person(string n, int s): n(n), s(s) {
}
};
Person a[n] = {Person("a", 30), Person("b", 23), Person("c", 23)};
// 返回true, a排在前面, 注意不要加=符号
int cmp(Person a, Person b)
{
return a.s < b.s;
}
int main()
{
sort(a, a+n, cmp);
for (int i = 0; i < n; i++)
{
printf("(%s,%d) ", a[i].n.data(), a[i].s);
}
}
实现多字段组合排序,如果成绩相同,按照名字降序排列
int cmp(Person a, Person b) { if (a.s == b.s) { return a.n > b.n; } return a.s < b.s; }
例题
把数组排成最小的数
输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
样例1
输入:10 2
输出:102
样例2
输入:3 30 34 5 9
输出:3033459
找到一个排序规则,数组根据这个规则排序后能排成一个最小的数字。要确定排序规则,就要比较两个数字,也就是给出两个数字m和n,我们需要确定一个规则来判断m和n哪个应该排在前面,而不是仅仅比较这两个数字的值的大小。根据题目的要求,两个数字m和n能拼接成数字mn和nm。如果mn<nm,那么m应该排在n的前面,此时我们定义m小于n;反之,如果mn>nm,我们定义m大于n。
使用C++实现
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <cstdio> using namespace std; const int n = 5; //int a[n] = {10, 2}; int a[n] = {3, 30, 34, 5, 9}; vector<string> strs; // 返回true, a排在前面 int cmp(string a, string b) { string s1 = a + b; string s2 = b + a; return s1 < s2; } int main() { char temp[1000]; for (int i = 0; i < n; i++) { sprintf(temp, "%d", a[i]); strs.push_back(string(temp)); } sort(strs.begin(), strs.end()); // 先对每个数字字符串按照升序排序 sort(strs.begin(), strs.end(), cmp); // 按照连接后更小的排在前面的规则进行排序 for (int i = 0; i < strs.size(); i++) { cout<<strs[i]; } }
python方法,使用python3进行自定义排序
ls = eval(input())
ls = list(map(str, ls))
#自定义类,将key参数(列表元素)转换为该类的对象,注意该类应该从str继承而来,可以利用 str的构造函数对字符串进行初始化
class Cmp(str):
# sorted内部应该用到 a1 < a2(key返回的对象),
# 重载 < 使得两个自定义对象可以表达 a1 < a2, 并且按照自定义规则排序
def __lt__(self, s):
return self + s < s + self
print("".join(sorted(ls, key=Cmp)))
测试python3的sorted函数
按照某个字段进行排序
ls = [['a', 23], ['b', 23], ['c', 30]]
def cmp(x):
return x[1]
print(sorted(ls, key=cmp))
按照多个字段组合规则进行排序
ls = [['a', 23], ['b', 23], ['c', 30]]
class cmp(list):
def __lt__(self, x):
if self[1] == x[1]:
return self[0] > x[0]
return self[1] < x[1]
print(sorted(ls, key=cmp))
浙公网安备 33010602011771号