在Linux上编写脚本程序并运行——第二弹

话不多说,直接来吧。
问题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之间的随机数,并执行以下操作:

  1. 通过declare -a random_numbers创建一个数组,用于存储生成的随机数。
  2. 使用for循环生成200个随机数,并将它们存储在random_numbers数组中。生成的随机数范围是1到10000。
  3. 初始化maxmin变量,分别用于存储最大值和最小值,并初始化sum变量用于计算总和。
  4. 使用另一个for循环遍历random_numbers数组,比较每个随机数的大小,并根据需要更新maxmin的值,同时计算总和。
  5. 使用bc命令来计算平均值,bc是一个用于数学计算的工具,通过bc -l选项来启用浮点数运算,scale=2指定结果保留两位小数。
  6. 最后,脚本输出生成的随机数、最大值、最小值和平均值。

问题二:试着在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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Umbra_squire233

谢谢大佬的投喂qwq

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值