华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1012|回复: 0
打印 上一主题 下一主题

C++:标准模板库Sort

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-8-11 09:27:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一.概述

STL几乎封装了所用的数据结构中的算法,这里主要介绍排序算法的使用,指定排序迭代器区间后,即可实现排序功能。

所需头文件#include <algorithm>

sort函数:对给定区间所有元素进行排序,默认两个参数或三个参数,第一个参数待排序区间的首地址,第二个参数待排序区间尾地址的下一个地址。
只传递两个参数默认使用升序排序,如想按照降序排序需要传入第三个参数,第三个参数可以使用库函数也可以自定义比较函数。

第三个参数使用库函数:
包含头文件<functional>
升序:less<data-type>()
降序:greater<data-type>()

二.使用
2.1 对数组排序
2.1.1 使用库函数作为比较函数
#include "stdio.h"
#include "stdlib.h"
#include <algorithm>
#include <functional>

using namespace std;

int main1()
{
        int data[10] = {0};
        for (int i=0; i<10; i++)
        {
                data[i] = rand() % 10;
        }
        printf("排序前数据:");
        for (int i=0; i<10; i++)
        {
                printf("%d ", data[i]);
        }

        //升序排序
        sort(data, data+10, less<int>());

        printf("\n升序后数据:");
        for (int i = 0; i < 10; i++)
        {
                printf("%d ", data[i]);
        }

        //降序排序
        sort(data, data+10, greater<int>());

        printf("\n降序后数据:");
        for (int i = 0; i < 10; i++)
        {
                printf("%d ", data[i]);
        }
        getchar();
        return 1;
}


2.1.2 自定义比较函数
#include "stdio.h"
#include "stdlib.h"
#include <algorithm>

using namespace std;


//升序比较函数
bool compare1(const int& a , const int& b)
{
        return a < b;
}

//降序比较函数
bool compare2(const int& a, const int& b)
{
        return a > b;
}

int main()
{
        int data[10] = { 0 };
        for (int i = 0; i < 10; i++)
        {
                data[i] = rand() % 10;
        }
        printf("排序前数据:");
        for (int i = 0; i < 10; i++)
        {
                printf("%d ", data[i]);
        }

        //升序排序
        sort(data, data + 10, compare1);

        printf("\n升序后数据:");
        for (int i = 0; i < 10; i++)
        {
                printf("%d ", data[i]);
        }

        //降序排序
        sort(data, data + 10, compare2);

        printf("\n降序后数据:");
        for (int i = 0; i < 10; i++)
        {
                printf("%d ", data[i]);
        }
        getchar();
        return 1;
}


2.2 对vector排序
2.2.1 对vector存放的整形排序
#include "stdio.h"
#include "stdlib.h"
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

//升序比较函数
int compare1(const int &a, const int &b)
{
        return a < b;
}

//降序比较函数
int compare2(const int &a, const int &b)
{
        return a > b;
}

int main()
{
        vector<int> v;
        for (int i=0; i<10; i++)
        {
                v.push_back(rand() % 10);
        }

        //遍历输出
        printf("排序前数据:");
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
                printf("%d ", *it);
        }

        //升序排序
        sort(v.begin(), v.end(), compare1);

        //遍历输出
        printf("\n升序后数据:");
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
                printf("%d ", *it);
        }
       
        //降序排序
        sort(v.begin(), v.end(), greater<int>());

        //遍历输出
        printf("\n降序后数据:");
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
                printf("%d ", *it);
        }

        getchar();
        return 1;
}



2.2.2 对vector存放的类成员变量排序
#include "stdio.h"
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

class Student {
public:       
        Student(string n, int c) :name(n), core(c) {}

        string        name;
        int                core;
};

//升序比较函数
bool compare1(const Student& s1, const Student& s2)
{
        return s1.core < s2.core;
}

//降序比较函数
bool compare2(const Student& s1, const Student& s2)
{
        return s1.core > s2.core;
}


int main()
{
        vector<Student> v;
        Student s1("aaaa", 97);
        Student s2("bbbb", 99);
        Student s3("cccc", 95);

        v.push_back(s1);
        v.push_back(s2);
        v.push_back(s3);

        printf("排序前数据:\n");
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
        {
                printf("%s; %d\n", ((*it).name).c_str(), (*it).core);
        }

        //升序排序
        sort(v.begin(), v.end(), compare1);

        printf("\n升序后的数据:\n");
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
        {
                printf("%s; %d\n", ((*it).name).c_str(), (*it).core);
        }

        //降序排序
        sort(v.begin(), v.end(), compare2);
        printf("\n降序后的数据:\n");
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
        {
                printf("%s; %d\n", ((*it).name).c_str(), (*it).core);
        }
        getchar();
        return 1;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 02:50 , Processed in 0.506745 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表