排序方法及应用

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

 

找到一个排序规则,数组根据这个规则排序后能排成一个最小的数字。要确定排序规则,就要比较两个数字,也就是给出两个数字mn,我们需要确定一个规则来判断mn哪个应该排在前面,而不是仅仅比较这两个数字的值的大小。根据题目的要求,两个数字mn能拼接成数字mnnm。如果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))
 
 
 
 
 
 
 
 
 
 
 





 

posted on 2020-04-18 09:00  candyYang  阅读(173)  评论(0)    收藏  举报