使用一个小脚本,将随机数放入一个10 000大小的数组中,然后在课程中使用方法对所有这个数组进行排序。
我已经完成了这段代码,但似乎它开始排序(当我测试时,我有一些" a"它们已经打印但没有那么多,我不会'明白为什么)
我相信这个问题来自于我在val阵列上的测试,这可能是一个初学者的错误,但我不知道如何在网上找到问题,因为我没有&# 39;真的,现在哪一行是问题。
我没有必要得到答案,只是一些线索,发现它可能是好的:)
这是我的代码:(对stackoverflow来说是新手,所以我不知道如何直接提供好的代码视图,如果有人可以告诉我的话)
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"`
如我所知,由于我只想要排序操作之前和之后的日期,因此我无法获得有用的输出。但是,这种排序只是假设将值从低到高,将它们逐两取,并在必要时将它们反转。这样做直到没有数字反转。
编辑:我尝试使用手动编号: 10 3 6 9 1
当通过在for循环中放置echo $ {val [*]}来运行它时,它只是以相同的顺序打印相同列表的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();
谢谢:)
答案 0 :(得分:3)
如果我理解你想知道为什么这个脚本没有产生“a”表示最初在“for”循环中产生的数字的数组的顺序是正确的,那么这是一个解决方案:
您的变量扩展的语法不正确。 ${var}
在括号内不能有数学运算符,因为它们在这里有不同的含义。在普通的非关联数组中,Zsh使用一些基本的数学支持处理下标,因此您可以像以前一样使用${array[var+1]}
而不是${array[${var+1}]}
。
我怀疑这种情况的原因 - 复杂,容易出错的POSIX语法 - 可以通过使用简化的Zsh语法来避免,但正如之前的评论所述,它不能移植到其他shell。
有些shell支持类似功能:Bash支持大多数但不支持裸下标($array[var]
)。字符串可以在Zsh中以类似的方式排序,但数学上下文括号((
和))
必须替换为普通的测试括号[[
和]]
以及可能必须使用特殊的$val
选项定义数组typeset
,以便以所需的方式比较字符串;也就是说,它们可能必须填充并且左右对齐。为了比较枚举类型,比如1月到2月,关联数组和大小写转换会变得更复杂。
以下是具有相应更改的脚本,然后再次使用简化的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"`
岩组:
#!/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"`