数组的简单命令,以及排序算法

Posted 丁CCCCC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的简单命令,以及排序算法相关的知识,希望对你有一定的参考价值。

一、数组定义

四种定义方式:
需要注意的是

  • “1 2 3 4 0”是数组
  • “1234”则是字符串

第一种方式

在这里插入图片描述

第二种方式

在这里插入图片描述

第三种方式

在这里插入图片描述

第四种方式

在这里插入图片描述

二、数据类型

共有两类

  • 数值类型
  • 字符类型
    使用 " " 或 ’ ’ 定义

三、数组的几个简单命令

3.1、获取数组长度

命令

num=(1 2 3 4 5 6 7 8)
length=${#num[*]}
echo $length
8

length=${#num[@]}			# 中间换成@一样能实现功能

示意图
在这里插入图片描述

3.2 获取数据列表

命令

num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8

echo ${num[@]}				# @功能一样

示意图
在这里插入图片描述

3.3 获取某下标赋值

下标赋值的第一位是0,0 1 2 3…依次延续下去

命令

num=(1 2 3 4 5 6 7 8)
index3=${num[3]}
echo $index3
4

示意图
在这里插入图片描述

3.4 数组遍历

命令

[root@ccc lianxi]# num=(1 2 3 4 5 6 7 8)
[root@ccc lianxi]# for i in ${num[@]}			# *号功能一样
> do
> echo $i
> done
1
2
3
4
5
6
7
8

示意图
在这里插入图片描述

3.5 数组切片

命令

num=(1 2 3 4 5 6 7 8)
echo ${num[@]}				# 输出数组
1 2 3 4 5 6 7 8
echo ${num[@]:0:3}			# 数组名[@或*]:起始:所需长度
1 2 3
echo ${num[*]:2:5}
3 4 5 6 7
echo ${num[@]:2:3}
3 4 5

示意图
在这里插入图片描述

3.6 数据替换

命令

num=(1 2 3 4 5 6 7 8)
echo ${num[@]/3/777}		# 将3替换为777
1 2 777 4 5 6 7 8
echo ${num[@]}				# 替换只是临时性,再次查看就没有了,要改变需重新赋值
1 2 3 4 5 6 7 8

示意图
在这里插入图片描述

3.7 数组删除

命令

num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
unset num					# 数组删除命令
echo ${num[*]}

示意图
在这里插入图片描述

四、数组追加

4.1 第一种

命令

num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
num[3]=666					# 根据相应的下标替换输入的值
echo ${num[*]}
1 2 3 666 5 6 7 8

示意图
在这里插入图片描述

4.2 第二种

命令

num=(1 2 3 4 5 6 7 8)
echo ${num[*]}
1 2 3 4 5 6 7 8
num[${#num[@]}]=777			# 追加到最后一位
echo ${num[*]}
1 2 3 4 5 6 7 8 777

4.3 第三种

命令

num=(1 2 3 4 5 6 7 8)
num=("${num[@]}" 11 22 33 44)		# 批量添加,@不能更换为*
echo ${num[*]}
1 2 3 4 5 6 7 8 11 22 33 44

双引号不能忽略,否则当num中有空格时会按照空格将元素拆分多个

示意图
在这里插入图片描述

4.4 第四种

命令

num=(1 2 3 4 5 6 7 8)
num+=(aa bb cc dd)				# 更简单的批量添加
echo ${num[*]}
1 2 3 4 5 6 7 8 aa bb cc dd

示意图

在这里插入图片描述

五、向函数传数组参数

如果将数组变量作为函数参数,函数则只会取数值变量的第一个值:

cc1 () {
  echo "接收到的参数列表:$@"
  newarrary=($@)
  echo "新数组的值为:${newarrary[*]}"
}

array=(2 5 1 4 3)
echo "原数组的值:${array[*]}"
cc1 $array

在这里插入图片描述

解决这个问题需要将组变量分解成单个的值,然后将这些值作为函数参数使用,在函数内部,在将所有的参数重新组合成新的数组变量

cc2 () {
  newarrary=($(echo $@))				# 定义新数组,元素为全部参数
  echo "新数组的值:${newarrary[*]}"
}

array=(2 5 1 4 3)
echo "原始数组的值:${array[*]}"
cc2 ${array[*]}

在这里插入图片描述

六、从函数中返回数组

cc1() {								# 求和
  newarrary=(`echo $@`)
  sum=0
  for i in ${newarrary[*]}
  do
    sum=$[$sum + $i]
  done
  echo $sum
}

cc2 () {							# 两倍值
  newarrary=(`echo $@`)
  for ((i=0; i<=$[$# - 1]; i++))
  {
    newarrary[$i]=$[${newarrary[$i]} * 2]
  }
  echo ${newarrary[*]}
}

array=(3 5 1 2 4)
echo "原始数组的值:${array[*]}"
result1=`cc1 ${array[*]}`
echo "新数组的和:$result1"

result2=(`cc2 ${array[*]}`)
echo "新数组的值:${result2[*]}"

在这里插入图片描述

七、数组排序算法

7.1 冒泡排序

会将数据在数组中从小到大或者从大到小向前移动

基本思想

冒泡排序的基本思想是相邻的两个元素值,如果这连个值满足条件就交换元素值,把小的那一方移动到数组前面,大的移动到数组后面(也就是交换两个元素的位置),这样小的元素就像气泡一样从底部上升到顶部

算法思路

冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少

模板

命令

#定义一个初始数组
read -p "请输入一个随机数组列表" list
arr=($list)
echo "原数组的顺序为:${arr[@]}"

length=${#arr[@]}		#获取数组长度

for ((i=1; i<$length; i++))			#定义比较轮数,为数组长度减一,并且从1开始
do
  #确定每次比较的元素下标,比较相邻的两个元素,大的放后面
  for((j=0; j<$length-$i; j++))			  #每轮比较的次数随着轮数递减
  do
  first=${arr[$j]}			  #获取第一个元素的值
  k=$[$j + 1]				  #获取第二个元素的值
  second=${arr[$k]}

  #比较第一个元素和第二个元素的值,如果1大于2,两个元素交换位置
  if [ $first -gt $second ];then

    temp=${arr[$j]}			    #把第一个元素的值保存在临时变量temp中
    arr[$j]=$second			    #把第二个元素的值赋给第一个元素
    arr[$k]=$temp			    #把原来第一个元素的值赋给第二个元素
  fi
  done
done

echo "排序号新的数组的顺序为:${arr[@]}"

示意图
在这里插入图片描述

7.2 直接选择排序

与冒泡排序不同,直接排序的交换次数更少,对等的速度就会更快

基本思想

  • 指定排序位置与其它数组元素分别对比,满足条件的就交换元素值
    • 和冒泡排序不同,不是交换相邻的元素,而是把满足条件的元素与指定的排序位置交换( 从最后一个元素开始排序)
  • 这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式

模板

命令

cc=(11 24 7 51 35)
length=${#cc[*]}
for ((i=1; i<$length; i++))			# 定义排序轮数
do
  index=0
  for ((j=1; j<=$length-$i; j++))			# 确定用于比较的第一个元素的索引范围
  do
    if [ ${cc[$j]} -gt ${cc[$index]} ];then			# 通过比较来获取最大元素的索引位置
       index=$j
    fi
  done
  last=$[$length - $i]				# 获取每轮最后一个元素的索引
  temp=${cc[$last]}					# 把当前轮次的最后一个元素的值保存在临时变量中
  cc[$last]=${cc[$index]}			# 把最大的元素值赋予最后一个元素
  cc[$index]=$temp					# 原最后一个元素的值赋予给原最大位置的元素
done

echo "重新排序后的数:${cc[*]}"

示意图
在这里插入图片描述

7.3 反转排序

顾名思义,用相反的顺序把原来的数组重新排序

基本思想

把数组最后一个元素和第一个对调,倒数第二个和正数第二个对调,以此类推完成所有的反转

模板

命令

cc=(10 20 30 40 50 60)
length=${#cc[*]}
for ((i=0; i<$length/2; i++))
do
  temp=${cc[$i]}
  cc[$i]=${cc[$length-$i-1]}
  cc[$length-$i-1]=$temp
done

echo ${cc[*]}

示意图

在这里插入图片描述

7.4 希尔排序

命令

num=(5 7 3 1 2 8 6 4)
length=${#num[*]}

# 把距离为gap的元素编到一个组,扫描所有组,每次扫描减少增量
for ((gap=$length/2; gap>0; gap/=2))		
do
  for ((i=gap; i<$length; i++))
  do

  temp=${num[$i]}
# 对距离为gap的元素组排列,每一轮比较拿当前轮次最后一个元素与组内其他元素比较,将数组大的往后放
    for ((j=i-gap; j>=0&&temp<${num[$j]}; j-=gap))
    do
  num[$j+$gap]=${num[$j]}

    done
 # 和最左边较大的元素对调位置
  num[$j+$gap]=$temp

  done
done

echo ${num[*]}

示意图

在这里插入图片描述

以上是关于数组的简单命令,以及排序算法的主要内容,如果未能解决你的问题,请参考以下文章

选考VB算法专题系列讲座9插入排序算法

简单排序算法:冒泡法排序(Java)

算法排序之堆排序

多种排序算法的思路和简单代码的实现

TimSort排序算法及一个问题分析

快速排序-递归实现