Linux shell sort实现稳定排序

一个例子:

输入:

3739  99992076288 131072
3739  99996401664 202144
3739  10000649420 331072
3739  00000649420 231072
3738  99996401664 231072

需求:按照第一个字段排序,相等情况下保持原顺序不变。

期望输出:

3738 6401664 231072 
3739 2076288 131072 
3739 6401664 202144 
3739 1649420 331072 
3739 0649420 231072

shell 命令:sort -k1,1

输出如下:

3738 6401664 231072 
3739 0649420 231072 
3739 1649420 331072 
3739 2076288 131072 
3739 6401664 202144

结果分析:sort的结果不符合预期,在3739相等时,<3739 2076288 131072>应该在<3739 1649420 331072>前面,但是shell运行的结果却发生了改变,即不是稳定排序。

何为稳定排序:

相关介绍:shell sort 最后一列排序_十大经典排序算法(一)_weixin_39584549的博客-CSDN博客

Linux shell的sort排序功能十分强大,通过man sort内容如下:

因此,要想得到稳定的排序结果,需要追加-s 

另外一个资料:

Linux sort命令中文手册(info sort翻译)_Linux教程_Linux公社-Linux系统门户网站

sort排序规则为:按照命令行中给定的字段顺序对给定的字段进行排序,排序时根据为每个字段分配的排序选项进行排序,直到发现不同的排序选项或者排序列结束。如果没有给定排序key(注:key即为-k指定的值),则对整行进行排序。最后,如果所有给定的key的比较结果都相等时,将对整行进行完全默认的排序(注:即以字母升序排序),但"-r"可以改变这次的升、降序结果。这次排序称为"最后的排序"。使用"-s"选项可以禁止"最后的排序",使得那些排序结果相同的行保留最初的相对顺序。"-u"选项同样也会禁止"最后的排序"。

通过上面的资料,应该是sort按照字段排序完成后,然后又对指定排序字段相等的行,进行了一次整行的默认(升序)排序,导致结果不符合预期,因此要想实现稳定排序,则需要禁止这最后一次排序,即增加 -s

修正:sort -k1,1 -s

3738 6401664 231072 
3739 0649420 231072 
3739 1649420 331072 
3739 2076288 131072 
3739 6401664 202144 

符合预期。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值