话不多说,直接来吧。
问题1:设计出一个在1-10000的随机数生成器,随机生成200个数,并自动比较大小(列出这200个数中的最大值和最小值即可),并自动求平均数。
#!/bin/bash
# 生成200个随机数,并存储在一个数组中
declare -a random_numbers
for ((i=1; i<=200; i++)); do
random_numbers[i]=$((1 + RANDOM % 10000))
done
# 初始化最大值、最小值和总和
max=${random_numbers[1]}
min=${random_numbers[1]}
sum=0
# 遍历数组,比较大小并计算总和
for number in "${random_numbers[@]}"; do
if ((number > max)); then
max=$number
fi
if ((number < min)); then
min=$number
fi
sum=$((sum + number))
done
# 计算平均值
average=$(bc -l <<< "scale=2; $sum / 200")
# 输出结果
echo "生成的随机数:"
echo "${random_numbers[@]}"
echo "最大值: $max"
echo "最小值: $min"
echo "平均值: $average"
这个脚本的主要功能是生成200个1到10000之间的随机数,并执行以下操作:
- 通过
declare -a random_numbers
创建一个数组,用于存储生成的随机数。 - 使用
for
循环生成200个随机数,并将它们存储在random_numbers
数组中。生成的随机数范围是1到10000。 - 初始化
max
和min
变量,分别用于存储最大值和最小值,并初始化sum
变量用于计算总和。 - 使用另一个
for
循环遍历random_numbers
数组,比较每个随机数的大小,并根据需要更新max
和min
的值,同时计算总和。 - 使用
bc
命令来计算平均值,bc
是一个用于数学计算的工具,通过bc -l
选项来启用浮点数运算,scale=2
指定结果保留两位小数。 - 最后,脚本输出生成的随机数、最大值、最小值和平均值。
问题二:试着在linux的shell上用代码表示集中常见的算法(冒泡、快速、二分查找)
冒泡排序(Bubble Sort):
冒泡排序是一种基本的排序算法,它通过多次迭代遍历数组,比较相邻元素并交换它们,以将最大的元素“冒泡”到数组的末尾。主要步骤如下:
- 使用嵌套的
for
循环,外部循环迭代每个元素,内部循环执行比较和交换操作。 - 如果发现相邻元素的顺序不正确(前一个元素大于后一个元素),则交换它们。
- 持续进行迭代,直到整个数组排序完成。
- 最终输出排序后的数组。
#!/bin/bash
arr=(5 2 9 1 5 6)
n=${#arr[@]}
for ((i = 0; i < n-1; i++)); do
for ((j = 0; j < n-i-1; j++)); do
if ((arr[j] > arr[j+1])); then
temp=${arr[j]}
arr[j]=${arr[j+1]}
arr[j+1]=$temp
fi
done
done
echo "冒泡排序结果: ${arr[@]}"
快速排序(Quick Sort):
快速排序是一种高效的排序算法,它使用分治策略,通过选择一个“基准元素”将数组分成两部分,然后递归地对这两部分进行排序。主要步骤如下:
- 选择一个基准元素(通常是数组的第一个元素)。
- 分割数组,将小于或等于基准元素的元素放在左侧,大于基准元素的元素放在右侧。
- 递归对左右两部分进行排序,直到每个部分都有序。
- 合并已排序的部分并返回整个已排序数组。
#!/bin/bash
quick_sort() {
local arr=("$@")
local n=${#arr[@]}
if ((n <= 1)); then
echo "${arr[@]}"
return
fi
local pivot=${arr[0]}
local less=()
local greater=()
for elem in "${arr[@]:1}"; do
if ((elem <= pivot)); then
less+=($elem)
else
greater+=($elem)
fi
done
echo $(
quick_sort "${less[@]}"
echo $pivot
quick_sort "${greater[@]}"
)
}
arr=(5 2 9 1 5 6)
sorted_arr=($(quick_sort "${arr[@]}"))
echo "快速排序结果: ${sorted_arr[@]}"
二分查找(Binary Search):
二分查找是一种高效的搜索算法,用于在有序数组中查找特定元素的位置。主要步骤如下:
- 初始化左边界和右边界,指向数组的起始和结束位置。
- 在每一次迭代中,计算中间元素的索引。
- 如果中间元素等于目标元素,返回其索引。
- 如果中间元素小于目标元素,将左边界移至中间元素的右侧。
- 如果中间元素大于目标元素,将右边界移至中间元素的左侧。
- 持续迭代,直到找到目标元素或左边界大于右边界为止。
#!/bin/bash
binary_search() {
local arr=("$@")
local target=$1
local left=0
local right=$((${#arr[@]} - 1))
while ((left <= right)); do
local mid=$((left + (right - left) / 2))
if ((arr[mid] == target)); then
echo "目标元素 $target 在索引 $mid 处找到。"
return
elif ((arr[mid] < target)); then
left=$((mid + 1))
else
right=$((mid - 1))
fi
done
echo "目标元素 $target 未找到。"
}
arr=(1 2 3 4 5 6 7 8 9)
target=5
binary_search "${arr[@]}" $target