Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初学者Shell,can';无法找到问题(数组排序)_Shell_Sorting_Zsh - Fatal编程技术网

初学者Shell,can';无法找到问题(数组排序)

初学者Shell,can';无法找到问题(数组排序),shell,sorting,zsh,Shell,Sorting,Zsh,编写一个小脚本,将随机数放入一个10000大小的数组中,然后在课程中使用ask方法对所有数组进行排序 我已经完成了这段代码,但它似乎开始排序(当我测试时,我有一些“a”打印出来,但没有预期的那么多,我不明白为什么) 我相信这个问题来自我对val数组的测试,这可能是一个初学者的错误,但我真的不知道如何在web上找到问题,因为我现在不知道哪一行是问题所在 我不需要答案,只要找到一些线索就可以了:) 这是我的代码:(stackoverflow是新手,所以如果有人能告诉我的话,我不知道如何直接放置一个好

编写一个小脚本,将随机数放入一个10000大小的数组中,然后在课程中使用ask方法对所有数组进行排序

我已经完成了这段代码,但它似乎开始排序(当我测试时,我有一些“a”打印出来,但没有预期的那么多,我不明白为什么)

我相信这个问题来自我对val数组的测试,这可能是一个初学者的错误,但我真的不知道如何在web上找到问题,因为我现在不知道哪一行是问题所在

我不需要答案,只要找到一些线索就可以了:)

这是我的代码:(stackoverflow是新手,所以如果有人能告诉我的话,我不知道如何直接放置一个好的代码视图)

正如我所问的,我不能真正得到有用的输出,因为我只想要排序操作前后的日期。但是排序只是把值从低到高,取二乘二,必要时反转。这样做直到没有数字被颠倒

编辑:我尝试使用手册编号: 103691

当通过将echo${val[*]}放入for循环来运行它时,它只会以相同的顺序打印4次相同的列表,所以我猜它根本不起作用。。。我使用“如果”是错误的吗

编辑2:一开始,我是用C#做的,当时我想用shell做,首先是因为我想练习shell,然后是因为我想比较同样事情所需的效率和时间。这是C代码,正在运行

            Random random = new Random();
            int[] _tab = new int[100000];
            for (int i = 0; i < _tab.Length; i++)
            {
                _tab[i] = random.Next(1, _tab.Length);
            }

            bool perm;
            int tmp;
            DateTime dt = DateTime.Now;
            do
            {
                perm = false;
                for (int i = 0; i < (_tab.Length - 1); i++)
                {
                    if (_tab[i] > _tab[i + 1])
                    {
                        tmp = _tab[i];
                        _tab[i] = _tab[i + 1];
                        _tab[i + 1] = tmp;
                        perm = true;
                    }
                }
            }
            while (perm == true);

            Console.WriteLine((DateTime.Now - dt).TotalMilliseconds);
            Console.Read();
Random Random=new Random();
int[]_tab=新int[100000];
对于(int i=0;i<_tab.Length;i++)
{
_tab[i]=random.Next(1,_tab.Length);
}
布尔烫发;
int tmp;
DateTime dt=DateTime.Now;
做
{
perm=false;
对于(int i=0;i<(_tab.Length-1);i++)
{
如果(_-tab[i]>_-tab[i+1])
{
tmp=_tab[i];
_tab[i]=_tab[i+1];
_表[i+1]=tmp;
perm=true;
}
}
}
while(perm==true);
WriteLine((DateTime.Now-dt.totalmillizes);
Console.Read();

谢谢:)

如果我的理解是,您想知道为什么此脚本没有生成一个“a”,表示最初在“for”循环中生成的数字数组的顺序是正确的,那么这里有一个解决方案:

该语法对于变量扩展不正确
${var}
大括号内不能有数学运算符,因为它们在这里有不同的含义。在一个普通的非关联数组中,Zsh使用一些基本的数学支持来处理下标,因此您可以使用
${array[var+1]}
而不是像以前那样使用
${array[${var+1}]}

我怀疑产生这种情况的原因——复杂的、容易出错的POSIX语法——本可以通过使用简化的Zsh语法来避免,但正如在前面的评论中所述,它不能移植到其他shell

有些shell支持类似的功能:Bash支持大多数,但不支持裸下标(
$array[var]
)。字符串可以以类似的方式在Zsh中排序,但数学上下文括号
((
必须替换为普通测试括号
[[
]]
和数组
$val
可能必须使用特殊的
排版
选项来定义,以使字符串以所需的方式进行比较;也就是说,它们可能必须被填充,并右对齐或左对齐。对于比较枚举类型(如Jan-Feb),关联数组和大小写转换会变得稍微复杂一些

下面是经过适当修改的脚本,然后是简化的Zsh:

#!/bin/sh
for i in `seq 1 10000`;
do
    val[$((i))]=$RANDOM
done
echo `date +"%M.%S.%3N"`

FLAG=0
until [ $FLAG -eq 1 ]
do
    FLAG=1
    for j in `seq 1 9999`;
    do
        if [ ${val[$((j))]} -gt ${val[$((j+1))]} ]
        then
            TMP=${val[$((j))]}
            val[$((j))]=${val[$((j+1))]}
            val[$((j+1))]=$TMP
            FLAG=0
            echo a
        fi
    done
done

echo `date +"%M.%S.%3N"`
Zsh:


使用突出显示文本编辑框左上角的
{}
格式化工具将其格式化为代码/数据/输出。(我们不要求人们转到Stackexchange中的外部站点,您的Q应该包含所有需要的信息,包括小输入、预期输出、当前代码/ouput/error MSG以及您对该问题的想法以及您是如何做到的;-))。祝你好运。谢谢你的帮助,我正在尝试单击它然后粘贴,所以它不起作用!^-^很高兴知道!:)还要注意我对小样本输入、预期输出的评论…;-)可能运行
seq 110
,用这些值强制数组,然后您可以预测预期输出。祝你好运。我做到了,但这很难,因为除了开始和结束时的2个日期之外,我不想要任何输出。但是我补充了我想要什么类型的,以及它应该如何工作。是的,我确实可以尝试使用非随机数。一旦它使用一小部分测试数据,那么你可以将它“调高”到10000,看看它是否真的有效;-)。我一点也不清楚你所说的“除了开始和结束时的2个日期之外,我不想要任何输出”是什么意思。这就是为什么小样本输入和预期输出在整个过程中很重要的原因。你真的只是指输出=
20.23.456
22.47.789
?祝你好运
#!/bin/sh
for i in `seq 1 10000`;
do
    val[$((i))]=$RANDOM
done
echo `date +"%M.%S.%3N"`

FLAG=0
until [ $FLAG -eq 1 ]
do
    FLAG=1
    for j in `seq 1 9999`;
    do
        if [ ${val[$((j))]} -gt ${val[$((j+1))]} ]
        then
            TMP=${val[$((j))]}
            val[$((j))]=${val[$((j+1))]}
            val[$((j+1))]=$TMP
            FLAG=0
            echo a
        fi
    done
done

echo `date +"%M.%S.%3N"`
#!/bin/zsh
foreach i ( {1..10000} )
    val[i]=$RANDOM
end
echo `date +"%M.%S.%3N"`

FLAG=0
until ((FLAG))
do
    FLAG=1
    foreach j ( {1..9999} )
        if (( val[j] > val[j+1] ))
        then
            TMP=$val[j]
            val[j]=$val[j+1]
            val[j+1]=$TMP
            FLAG=0
            echo a
        fi
    end
done

echo `date +"%M.%S.%3N"`