数值排序问题-shell

数值排序问题 - 超大数比较

问题

文本a.txt中有20行随机产生的数列,如下:

2928326128601232462131283250710027308938740594716691200992050511576
5352129649530193383124730478244772348721985707222557212265817305
217141333532296179938475175265792931789219830308392472584606305
2371620291160322081050531817416284225477019123161801285941026814244
283929972304551060318886921731765136928849135391662294051194618754
1809165929787147057932949630411324311737224509104016550662932273
27396236084901303873154718299242931819623155304661177528921164510335
254221462410491137971033914630292752245114969186002809930190939425
1085287492160525651862932475207612387312368408826675135332406418337
2567810118246621010283281198810903279355871571118961177731143829148
23727111515524141721964179351992331180134926914198081871053303186
378579502856625703213542353218420835730692264021219729654278515442
30215186011014395001656818458819061824708536511543271701327524725
223702764213159156022932717903282522044350522584222768193271431422354
3079720530119542370417125702274761144023302102641160114921224469221
15642298214000242538839193816839550322381321993212316517861828002
13042178002978222022331319116624809338275899045263351248023569
11252165681825711849278422768716060438517976169102391532289954712000
105084292396529699311371735329685626410510259482788519645152723476
29674179062831103792824121564178225289202161443911094228581583531951

要求

通过纯批处理按照数列的大小顺序,正序输出如下
PS:每行的数值都远远超过了cmd所能计算的最大数值。

13042178002978222022331319116624809338275899045263351248023569
217141333532296179938475175265792931789219830308392472584606305
1809165929787147057932949630411324311737224509104016550662932273
5352129649530193383124730478244772348721985707222557212265817305
15642298214000242538839193816839550322381321993212316517861828002
23727111515524141721964179351992331180134926914198081871053303186
30215186011014395001656818458819061824708536511543271701327524725
105084292396529699311371735329685626410510259482788519645152723476
254221462410491137971033914630292752245114969186002809930190939425
283929972304551060318886921731765136928849135391662294051194618754
378579502856625703213542353218420835730692264021219729654278515442
1085287492160525651862932475207612387312368408826675135332406418337
2371620291160322081050531817416284225477019123161801285941026814244
2567810118246621010283281198810903279355871571118961177731143829148
2928326128601232462131283250710027308938740594716691200992050511576
3079720530119542370417125702274761144023302102641160114921224469221
11252165681825711849278422768716060438517976169102391532289954712000
27396236084901303873154718299242931819623155304661177528921164510335
29674179062831103792824121564178225289202161443911094228581583531951
223702764213159156022932717903282522044350522584222768193271431422354

编写代码

编写一个比较大数的函数,创建文件
compare.sh

#! /bin/bash

##  比较两个数大小
##  
##  返回值
##
##  1    第一个数字大于第二个数字
##  0    第一个数字等于第二个数字
## -1    第一个数字小于第二个数字
function compare()
{
        str1=$1
        str2=$2
        param=$#

                ## 这里不做判断是否为数字处理

        flag=
        if [ ${param} -ne 2 ]
        then
                        echo "参数个数: ${param},不为2,不能计算,请核实"
                        exit
        fi

        ## 比较两个数字位数,位数大则数字大
        len1=${#str1}
        len2=${#str2}
        if [ ${len1} -gt ${len2} ]
        then
                        flag=1
        elif [ ${len1} -lt ${len2} ]
        then
                        flag=-1
        else
                        ## 两个数字位数一样,依次比较两个数各个位大小

                        i=0
                        while [ ${i} -lt ${len1} ]
                        do
                                        c1=${str1:${i}:1}               
                                        c2=${str2:${i}:1}               

                                        if [ ${c1} -gt ${c2} ]
                                        then 
                                                        flag=1
                                                        break
                                        elif [ ${c1} -lt ${c2} ]
                                        then 
                                                        flag=-1
                                                        break
                                        else
                                                        flag=0
                                        fi
                                        let i++
                        done
        fi

        echo ${flag}
}

排序文件
run.sh

#! /bin/bash

## 引入其他文件 - 使用 compare 函数
. ./compare.sh

file=./a.txt

## 将文件转化为一维数组
i=0
while read line
do
        lines[${i}]=${line}
        let i++
done < ${file}

## 一位数组个数
len=${#lines[*]}

## 使用简单选择排序
i=0
while [ ${i} -lt ${len} ]
do
        index=${i}
        minindex=${i}

        let j=${i}+1
        while [ ${j} -lt ${len} ]
        do
                ##  if [ ${lines[${index}]} -gt ${line[${j}]} ] 特大数字不能直接参与运算,使用我们自定义函数

                ret=`compare ${lines[${minindex}]} ${lines[${j}]}`
                if [ ${ret} -eq 1 ]
                then
                        minindex=${j}
                fi

                let j++
        done

        ## 交换index与minindex的值
        tmp=${lines[${index}]}
        lines[${index}]=${lines[${minindex}]}
        lines[${minindex}]=${tmp}

        let i++
done

##输出
i=0
while [ ${i} -lt ${len} ]
do
        echo ${lines[${i}]}
        let i++
done

测试

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值