首页 > 其他分享 >sort是不稳定排序

sort是不稳定排序

时间:2023-10-15 15:22:07浏览次数:37  
标签:sort 稳定 int ++ num str 排序

一道题调了一周,今天终于调过了……
题目不算很难写,就是poj1007的DNA sorting,字符串求逆序数然后升序排序。
之前交的代码是这样的:

#include<iostream>
#include<algorithm>
using namespace std;

typedef struct node {
    char str[55];
    int num;
} Node;

bool cmp(Node a, Node b) {
    return a.num < b.num;
}

int main() {
    int n = 0, m = 0;
    while(scanf("%d %d", &n, &m) == 2) {
        Node s[105];
        for(int i = 0; i < m; i++) {
            scanf("%s", s[i].str);
            s[i].num = 0;
            for(int j = 0; j < n - 1; j++) {
                if(s[i].str[j] == 'A') continue;
                for(int k = j + 1; k < n; k++) {
                    if(s[i].str[k] < s[i].str[j]) s[i].num++;
                }
            }
        }
        sort(s, s + m, cmp); // 这里用的是sort排序
        for(int i = 0; i < m; i++) printf("%s\n", s[i].str);
        printf("********************\n");
    }
    return 0;
}

实际上在poj上是可以过的。但是在我的oj上一直会WA一个点。今天终于发现是因为sort排序其实是不稳定的!!!

排序的稳定性

如果排序前后,相等的两个元素的相对位置发生了互换,就称这个排序是不稳定的。

sort

sort排序其实是结合了快速排序、堆排序和插入排序。当元素太少时会用插入排序,深度太大时会使用堆排序。
因为插入排序是稳定的,所以当我只输入5个字符串的时候是不会乱掉的。
但当我输入100个相同字符串,效果如下:

image

可以从后面那列数字(输入时按顺序标的)看出,此时已经乱掉了。
但是如果我用stable_sort(),效果马上就不一样了:

image

也可以通过修改sort参数的方法来实现稳定排序:
image

这样就可以实现当排序因素相等时,把先输入的放在前面了,也就是稳定排序。

快排

快排在选择基准数时是随机的,也就是说如果数组里有两个2,而选择的基准数是后面的2,那前面的2因为大于等于后面的2,就会被放在大数的群体里而被挪到基准2的后面,也就是这两个2的相对位置在排序前后发生了改变,所以称快排是不稳定的。

stable_sort()sort()略慢。是因为输入数据量小时,sort用插入排序提升了性能,而stabe_sort一直是基于归并排序。

标签:sort,稳定,int,++,num,str,排序
From: https://www.cnblogs.com/iszxh/p/17765667.html

相关文章

  • Linux系统稳定性压测工具-Stress安装及使用(转)
    在线安装:执行命令yuminstall-yepel-release&&yuminstallstress-y离线安装:一、stress工具下载:点击此处下载https://fossies.org/linux/privat/stress-1.0.4.tar.gz 二、上传stress包登录要安装的服务器,将stress-1.0.4.tar.gz上传到服务器,解压安装此处以实际工......
  • 一.排序算法---并归排序
    一.并归排序(自定义实现)merge函数:这个函数用于将两个已排序的子数组合并为一个更大的已排序数组。它包括创建临时数组L和R来存储左半部分和右半部分的元素,然后比较这些元素并将它们按升序合并到原始数组arr中。mergeSort函数:这个函数是归并排序的主要函数。它采用递......
  • r - How do I order by row.names in dataframe R语言 排序
     new_df<-df[order(row.names(df)),]REF:https://stackoverflow.com/questions/20295787/how-can-i-use-the-row-names-attribute-to-order-the-rows-of-my-dataframe-in-rhttps://stackoverflow.com/questions/25194196/how-do-i-order-by-row-names-in-dataframe......
  • Figma For Mac v114.3「UI协同设计软件」中文汉化版下载 稳定版
    FigmaMAC版是一款简单好用的UI设计软件,FigmaMAC最新版可以让大家都在一个画板上工作,设计、讨论,甚至直接在别人的工作上继续修改,FigmaMAC版还可以直接在设计界面上进行讨论,令协作更加方便,成员间还可以共享色彩库。Figma是一个基于浏览器的UI设计工具绝大部分的设计工具都是本地......
  • 深入了解基数排序:原理、性能分析与 Java 实现
    基数排序(RadixSort)是一种非比较性排序算法,它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。基数排序原理基数排序的基本原理是按照低位先排序,然后收集;再按照高位排序,再收集;以此类推,直到最高......
  • [HEOI2016TJOI2016]排序
    P2824[HEOI2016/TJOI2016]排序直接模拟复杂度爆炸,有观察到它只要求一个数。思维十分清奇。我们先考虑一个序列,如果全是0/1,该怎么做。发现这个问题很好做,修改区间时只需要先查询一的个数,然后将前面/后面全部置1,其他置0。然后我们考虑怎么转化。发现可以二分答案,对于小于mi......
  • [AGC037D] Sorting a Grid 题解
    学长给我看了这道题,感觉很有趣啊!想了想想出来了。考虑先把每个数还原到对应行上,然后用最后一次把它们斗出来。那么我们就是要在第一次操作后,对于每种颜色使得它平铺在这个块上。那么我们直接网络流或二分图匹配构造一下方案就做完力!......
  • 业务安全为企业带来的五重价值:防攻击、保稳定、助增收、促合规、提升满意度
    2023年暑假被“票贩子”和“黄牛”攻陷。他们利用各种手段抢先预约名额,然后加价出售给游客,导致了门票供不应求的局面,使原本免费开放的博物馆成为了“黄牛”的牟利工具。同样被黄牛党占领的还有电商平台和航空网站。他们利用作弊手段进行囤券,然后将抢到的优惠券低价出售牟利,由此给......
  • au软件下载/Audition电脑稳定版下载 AU安装教程
    AU是一款音频处理软件,全称为“AudioUnit”,在macOS环境下应用广泛。AU音频插件是苹果公司开发的一种音频效果插件,它可以为各种音频播放器、录音工具和数字音频工作站添加各种音频效果,如混响、合唱、压缩等。AU插件可以让音频处理与其他计算机操作同时进行,而不会影响计算机的速度和......
  • Almost Sorted (CF F ) (压状dp)
     思路:性质1,相当于重新对这个序列排序性质2, 等式关于值域,对于任意一个都满足,那么就是当前点比前面放入的点的最大值-k都要大,比后面最小值+k都要小,-->每一个点都要满足,那么对于当前点的放置是有限制的,以值域来看1-i里面都已经放置了,那么放置后......