C++ sort排序之降序、升序使用总结

一、升序

C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法:

1.1 重载比较操作符

比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作:

struct Student{
 string name;
 int grade;

 Student(string name, int grade) : name(name), grade(grade){}

 bool operator < (const Student& rhs) const{
  return grade < rhs.grade
  || (grade == rhs.grade && name < rhs.name);
 }

 friend void operator << (ostream& output, const Student& s){
  output << s.name << " " << s.grade << endl;
 }
};
int main()
{
 vector<Student> vec;

 vec.emplace_back("Jack", 20);
 vec.emplace_back("John", 30);
 vec.emplace_back("Amy", 20);
 vec.emplace_back("Bill", 90);

 cout << "Before:" << endl;
 for(auto& s : vec){
  cout << s;
 }

 sort(begin(vec),end(vec));

 cout << endl << "After:" << endl;
 for(auto& s : vec){
  cout << s;
 }

 return 0;
}

运行结果如下图:

1.2 比较函数

当然,我们也可以自己写比较函数,实现如下:

bool cmp(const Student& lhs, const Student& rhs){
 return lhs.grade < rhs.grade
 || (lhs.grade == rhs.grade && lhs.name < rhs.name);
}

按如下方式调用:

sort(begin(vec),end(vec), cmp);

1.3 函数对象

另外一种方式,即构造一个函数对象,抑或叫 functor,其实就是实现了重载 operator() 的一个类,代码如下:

struct Compare{
 bool operator()(const Student& lhs, const Student& rhs){
  return lhs.grade < rhs.grade
  || (lhs.grade == rhs.grade && lhs.name < rhs.name);
 }
};

按如下方式调用:

sort(begin(vec),end(vec), Compare());

1.4 Lambda

C++11有了 Lambda 之后,就不必再为某些小函数写具名函数了,如下使用即可:

sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {
				return lhs.grade < rhs.grade
				 || (lhs.grade == rhs.grade && lhs.name < rhs.name); });

二、降序

降序排序的方法与升序类似,如果采用比较函数、Lambda 或者比较函数的方式,只需要改一改比较条件就OK了,但是,如果对于Student类,我们定义了 operator < 之后,不想为了降序排序再定义一个 operator > 怎么办?两种办法!

2.1 reverse

升序排序之后,用 reverse 反转即可。

2.2 反向迭代

直接按如下方式调用即可,不用再去重载 operator >

sort(vec.rbegin(), vec.rend());

三、实例补充

对一个5位数的任意整数,求出其降序数。例如,整数是82319,则其降序数是98321。算法提示:将整数的各位数分解到一维整型数组a中,再将a数组中的元素按降序排序,最后输出a数组元素值。

试建立一个类DescendNUM,用于完成该功能。具体要求如下:

(1)私有数据成员
int n:存放5位数的整数。
int a[5]:存放其元素的降序排列值。
(2)公有成员函数
DescendNUM(int x=0):构造函数,用参数x初始化n。
void decompose ():将n的各位数分解到a数组。
void dsort():将a数组排成降序。
void show():显示元素及其降序数。
(3)在主函数中输入一个5位数的任意整数,然后定义一个DescendNUM类对象num,用上述输入的数初始化num,然后完成对该类的测试。

#include "stdafx.h"
#include<iostream>
using namespace std;
class DescendNUM
{
public:
	DescendNUM(int x){ n = x;}//:构造函数,用参数x初始化n。
void decompose ();//:将n的各位数分解到a数组。
void dsort();//:将a数组排成降序。
void show();//:显示元素及其降序数。
private:
	int n;//:存放5位数的整数。
 int a[5];//:存放其元素的降序排列值。
};

void DescendNUM::decompose ()
{
	int i=0;
	while(n!=0)
	{
		a[i++] = n%10;
		n = n/10;
	}
}
void DescendNUM::dsort()
{
	int j,i,t;
	int num=a[0];
	for(i=0;i<4;i++)
	for(j=0;j<5;j++)
	{
		if(a[j+1]>a[j])
		{
   t=a[j+1];
		 a[j+1]=a[j];
		 a[j] = t;
		}
	}
}
void DescendNUM::show()
{
	int i;
	for(i=0;i<5;i++)
	{
		cout<<a[i];
	}
	cout<<endl;
}
int main()
{
	DescendNUM num(82319);
	num.decompose ();
	num.dsort();
	num.show();
	return 0;
}

到此这篇关于C++ sort 排序(降序、升序)使用总结的文章就介绍到这了,更多相关C++降序、升序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ sort排序之降序、升序使用总结

    一.升序 C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法: 1.1 重载比较操作符 比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作: struct Student{ string name; int grade; Student(string name, int grade) : name(name), grade(grade){}

  • Arrays.sort如何实现降序排序

    目录 Arrays.sort实现降序排序 1.Collections的reverseOrder 2.利用Comparator接口复写compare Arrays.sort底层原理 概述 案例 总结 Arrays.sort实现降序排序 在调用Arrays.sort()对数组进行排序时,默认是升序排序的,如果想让数组降序排序,有下面两种方法: 1.Collections的reverseOrder import java.util.*;   public class Main {     public

  • 利用stream sorted进行降序排序

    根据value值的大小进行降序排序,并进行截取. public static void main(String[] args) { List<Map<String, Object>> list = Lists.newArrayList(); Map<String, Object> map = Maps.newHashMap(); map.put("id", 1); map.put("value", 20); list.add(ma

  • MySQL8新特性:降序索引详解

    前言 MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引. 无图无真相,同一个建表语句,看看MySQL 5.7和8.0的区别. create table slowtech.t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc)); MySQL 5.7 mysql> show create table slowtech.

  • MySQL 8中新增的这三大索引 隐藏、降序、函数

    目录 MySQL 8中的隐藏.降序.函数索引 一.隐藏索引 1.隐藏索引概述 2.隐藏索引操作 二.降序索引 1.降序索引概述 2.降序索引操作 三.函数索引 1.函数索引概述 2.函数索引操作 MySQL 8中的隐藏.降序.函数索引 一.隐藏索引 1.隐藏索引概述 MySQL 8.0开始支持隐藏索引(invisible index),不可见索引. 隐藏索引不会被优化器使用,但仍然需要进行维护. 应用场景:软删除.灰度发布. 在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索

  • JAVA基于Arrays.sort()实现数组升序和降序

    java中对数组进行排序 使用Array.sort() 这个默认是升序 @Test public void index4(){ int scores[] = new int[]{1,2,3,89,4}; Arrays.sort(scores); for (int i:scores ) { System.out.println(i); } } 如果想降序怎么办呢? 使用:Arrays.sort(scores,Collections.reverseOrder()); 需要注意的是 不能使用基本类型(

  • java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 package com.practice.test.comparable; import java.util.Date; /** * 描述:要比较的对象 * * @author cui * @create 2018-12-18 14:07 */ public class MySortBean implemen

  • Java TreeMap升序|降序排列和按照value进行排序的案例

    TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public static void main(String[] args) { TreeMap<Integer,Integer> map1 = new TreeMap<Integer,Integer>(); //默认的TreeMap升序排列 TreeMap<Integer,Integer>

  • 详解Java sort()数组排序(升序和降序)

    我们在学习 Java 的过程中肯定会遇到对数组进行升序或降序等排序问题,本节主要介绍如何实现 Java 数组的升序和降序.Java 语言使用 Arrays 类提供的 sort() 方法来对数组进行排序. 升序 使用 java.util.Arrays 类中的 sort() 方法对数组进行升序分为以下两步: 导入 java.util.Arrays 包. 使用 Arrays.sort(数组名) 语法对数组进行排序,排序规则是从小到大,即升序. 假设在数组 scores 中存放了 5 名学生的成绩,现在

  • Java List的sort()方法改写compare()实现升序,降序,倒序的案例

    本文旨在通过重写Comparator接口的compare()方法实现对List的升序.降序.倒序排序. 首先明确一点: compare(Integer o1, Integer o2){}中,o1代表的是List容器中的后一个元素,o2代表的是List容器中的前一个元素! 通过以下例子可以清晰了解这一点: public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); li

随机推荐