首页 > 其他分享 >sort排序疑惑

sort排序疑惑

时间:2024-01-21 20:24:00浏览次数:25  
标签:sort 疑惑 compare age 60 病人 排序

今天做到了一道题是这样的:
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄≥60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
输入格式
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄(不超过100岁),中间用单个空格隔开。
输出格式
按排好的看病顺序输出病人的ID,每行一个。

由于sort排序有不稳定性,所以有一种排序方案是加一个变量作为序号去排。
然后我们也可以使用stable_sort排序。这里stable_sort排序的比较函数的写法如下:
python bool cmp(Node a, Node b) { if (a.age >= 60 && b.age >= 60) {//都是老年人 return a.age > b.age; } return a.age >= 60;//老年人在前 }
这里在最开始的时候,就很疑惑,a.age>=60这里如果返回false,那么a和b不就交换了吗?
最开始查找了很多网上关于sort、stable_sort的文章,都没有说出个所以然来。
https://stackoverflow.com/questions/53254971/confusing-result-of-stdsort-stable-sort-compare-function-return-value

反正意思就是说当排序规则不满足下面这个图中的三个规则的时候,他是不进行处理的。

所以我们再来看这个a.age>=60这个规则,进入这个比较规则的时候,有一个前提条件就是a和b最多有一个是老人。
假设a和b一个年轻人一个老人,那么compare(a, b)=true, compare(b, a)=false,符合规则。所以会正常根据规则调整。
那么当a和b都是年轻人的时候,我们需要比较一下a和b了,此时compare(a, b)和compare(b, a)都会返回false。这不符合规则,所以他不会进行调整顺序操作。

https://www.apiref.com/cpp-zh/cpp/named_req/Compare.html

标签:sort,疑惑,compare,age,60,病人,排序
From: https://www.cnblogs.com/danlis/p/17978268

相关文章

  • 排序算法的性能比较
    写在前面菜鸡博主最近放寒假了,打算接下来的一段时间内回顾一下以前学过的一些知识,也是为考研做一些准备吧。很菜,勿喷,希望能和大家一起学习,共同进步!主要目标和具体要求目标排序对于数据处理是一项十分重要和基础的工作。采用如下算法实现排序功能:插入排序、交换排序、选择排序......
  • 洛谷 P9843 [ICPC2021 Nanjing R] Paimon Sorting 题解
    Descirption给出一个排序算法(用伪代码表示):SORT(A)forifrom1tonforjfrom1tonifa[i]<a[j]Swapa[i]anda[j]算出对于一个序列\(A=a_1,a_2,\cdots,a_n\)的所有前缀\(A_k=a_1,a_2,\cdots,a_k\)(\(1\lek\len\)),\(\operatorname{SORT}(A_......
  • 自定义排序
    问题:如何对数据进行自定义排序函数解决:=SORTBY(A2:A21,MATCH(A2:A21,E2:E11,))按自定义序列排序:选取数据中任一单元格》数据(或开始)》排序》自定义排序》勾选包含标题》次序》自定义序列》选取》确定》确定设置自定义序列:选取数据》文件》选项》自定义序列》从单元格导......
  • 排序算法与查找
    1.排序1.1冒泡排序冒泡排序,就是将相邻两个元素进行比较,如果前面那个元素和后面那个元素进行比较,如果前面元素比后者元素大,则进行交换位置。下面举例: 由图可知,共有5个元素,进行了四轮比较,假设有n个元素,则进行n-1轮比较(外部循环)。内部元素比较变化:第一轮把最大的元素给去......
  • compareTo、Comparator、TreeSet排序那些事
    前言:对于后端开发而言,学会对数据的自定义排序还是十分有必要的。需要用到排序的场景也是很多的,什么排行版展示、利用时间+别的条件排序、还有预接单的数据就是要展示在已接单的数据前面这种需求、等等。总之很重要的!一:对集合排序对以下的数据做展示顺序排序:未接单>预接单>已接单。(......
  • 最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目
    voidMain(){ varroot=newTreeNode(1) { left=newTreeNode(3) { left=newTreeNode(7), right=newTreeNode(6) }, right=newTreeNode(2) { left=newTreeNode(5), right=newTreeNode(4) } }; varr=newSolution().Minimu......
  • 148.排序链表
    1.题目介绍给你链表的头结点head,请将其按升序排列并返回排序后的链表。示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]2.题解在147.对链表进行插入排序中我们使用插入排序的方式对于链表进行排序插入排序的时间复杂度是O(n^2),其中n是链表的长度。这道题考虑时间复杂度......
  • Java - 排序
      冒泡排序升序排列importjava.util.Arrays;publicclassArrayDemo07{publicstaticvoidmain(String[]args){int[]a={1,4,5,3,14,12,51};int[]sort=sort(a);System.out.println(Arrays.toString(sort));}public......
  • 912.排序数组--堆排序
    1.题目介绍给你一个整数数组nums,请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]2.题解2.1堆排序思路题目给了我们一个vector数组,要使用堆排序,我们首先要创建一个大根堆,再在这个大根堆的基础上对数......
  • Quick sort【1月19日学习笔记】
    点击查看代码//Quicksort#include<iostream>usingnamespacestd;intpartition(intA[],intstart,intend){ intpivot=A[end];//默认选取末尾为主元 intpIndex=start;//分区索引初始化 for(inti=start;i<end;i++){//从索引start开始扫描 if(A[i]<......