4种 数组排序算法(冒泡/直接/反转/希尔排序),好好拿捏它!
发布日期:2021-05-20 00:14:05 浏览次数:21 分类:精选文章

本文共 2829 字,大约阅读时间需要 9 分钟。

数组

数组是一种基本的数据结构,能够存储一系列的数据单元,并允许通过索引位置进行快速的元素获取和修改。以下是关于数组的一些基本知识和操作方法。

数组包括的数据类型

数组可以存储多种数据类型,主要包括:

  • 数值类型(例如整数、浮点数)
  • 字符类型(可以使用双引号 " " 或单引号 ' ' 定义)

数组定义方法

在Bash中,可以通过以下几种方式定义数组:

  • 方法1:直接将数组初始化为多个值的序列:
    array_name=(value0 value1 value2 ...)
  • 方法2:逐个指定数组中的值:
    array_name[0]="value" array_name[1]="value" array_name[2]="value"
  • 方法3:使用带有双引号的字符串来定义数组的元素:
    array_name=( "${values[@]}" value1 value2 ...)

    注意:双引号必须保留,否则可能导致数组内容被拆分。

  • 方法4:使用括号包裹数组内容:
    array_name[0]="value" array_name[1]="value" array_name[2]="value"
  • 获取数组长度

    要获取数组的长度,可以使用以下命令:

    arr_number=(1 2 3 4 5)
    arr_length=${#arr_number[*]}

    arr_length=${#arr_number[@]}

    获取数组元素

    可以使用以下命令来获取数组的元素:

    echo ${arr_number[*]}  # 输出数组所有元素
    echo ${arr_number[@]} # 输出数组所有元素

    读取指定索引的元素

    arr_index2=${arr_number[2]}
    echo $arr_index2

    数组遍历

    使用循环结构遍历数组:

    #!/bin/bash
    arr=(10 20 30 40 50)
    for i in ${arr[@]} do
    echo $i
    done

    数组切片

    可以提取数组的一部分元素:

    arr=(1 2 3 4 5)
    echo ${arr[@]} # 输出整个数组
    echo ${arr[@]:0:2} # 获取前两个元素
    echo ${arr[@]:1:3} # 获取从第二个元素开始的三个元素

    数组替换

    使用替换命令可以直接修改数组中的值:

    arr=(1 2 3 4 5)
    # 查看替换前的数组值
    echo ${arr[@]}
    # 替换特定值
    echo ${arr[@]/4/66}
    # 实现数组修改,需使用赋值方式
    arr=(${arr[@]/4/66})
    # 查看替换后的数组值
    echo ${arr[@]}

    数组删除

    删除整个数组或指定索引的元素:

    arr=(1 2 3 4 5)
    unset arr # 删除数组
    arr=(1 2 3 4 5)
    unset arr[2] # 删除第三个元素

    数组追加元素

    可以通过以下方法追加元素:

  • 方法1:使用指定索引新增元素:
    array_name[index]=value
  • 方法2:使用数组长度获取当前索引:
    array_name[${#array_name[@]}]=value
  • 方法3:使用双引号将数组作为字符串处理并追加元素:
    array_name=( "${array_name[@]}" value1 value2 )
  • 方法4:使用+运算符追加元素(需使用括号):
    array_name+=(value1 value2 ...)
  • 向函数传数组参数

    要将数组传递给函数,需将数组拆分成单个元素:

    array=(3 2 1 4 5)
    test1 $array

    函数内部可用$@获取所有参数:

    test1() {
    new_array=($1) # 将第一个参数作为数组
    echo "新数组值为: ${new_array[*]}"
    }

    从函数返回数组

    函数可以返回数组作为变量:

    test2() {
    new_array=$(echo $@)
    for ((i=0; i<${#new_array[@]}; i++)) {
    new_array[ijection]?
    }
    return new_array
    }

    数组排序算法

    ① 冒泡排序

    • 基本思想:通过比较相邻元素,逐步将较大的元素“冒泡”到数组末尾,直到整个数组按要求排序。
    • 算法思路
    • 外层循环控制排序轮数,通常为数组长度减1。
    • 内层循环从当前轮数开始,逐个比较相邻元素。
    • 比较过程中,较大的元素交换位置。
    • 实现代码
      arr=(63 4 24 1 3 15)
      length=${#arr[@]}
      for ((i=1; i<$length; i++)) {
      for ((j=0; j<$length - i; j++)) {
      if [ ${arr[j]} -gt ${arr[j+1]} ]; then
      temp=${arr[j]}
      arr[j]=${arr[j+1]}
      arr[j+1]=temp
      fi
      done
      }
      echo "排序后数组:${arr[*]}"

    ② 直接选择排序

    • 基本思想:将数组中的最大元素找出,放在排序好的位置,逐步重复这个过程,直到整个数组排序完成。
    • 实现代码
      arr=(45 35 25 20 15)
      length=${#arr[@]}
      for i=(5 4 3 2 1); do
      max=-1
      for j=0 to $length-1; do
      if arr[j] > max; then
      max=arr[j]
      index=j
      fi
      done
      arr[index]= -1
      arr[A
      index=
      # 代码简化为直接交换最大值到最后
      done

    ③ 反转排序

    • 基本思想:将数组中的元素反转,通过交换相邻元素的位置,使数组元素按照相反顺序排列。
    • 实现代码
      arr=(1020 30 40 50 60)
      for ((i=0; i<${#arr[@]}/2; i++)) {
      temp=${arr[i]}
      arr[i]=${arr[ ${#arr[@]} -1 -i ]}
      arr[ ${#arr[@]} -1 -i ]=temp
      }
      echo "反转排序后数组:${arr[*]}"

    ④ 希尔排序

    • 基本思想:将数组分成若干组,逐步调整这些组中的元素,使其按顺序排列。
    • 实现代码
      arr=(20 10 30 50 60 40)
      length=${#arr[@]}
      gapxFFFF

    总结

    通过以上方法,可以对数组进行基本的操作,包括定义、查询、修改、排序等。选择合适的算法和方法,能够提升代码效率并实现不同需求。

    上一篇:正则表达式 熟能生巧
    下一篇:一行代码让你的python计算速度提高十倍

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月15日 23时32分18秒