美文网首页
shell入门15-使用shell脚本实现常用排序算法

shell入门15-使用shell脚本实现常用排序算法

作者: 万州客 | 来源:发表于2023-01-01 08:59 被阅读0次

原理上,这本书,是要一直好好啃啃的。干货很多~~~

一,冒泡排序法

image.png
#!/bin/bash
# 功能描述:通过简单的数字比较演示冒泡算法

# 使用数组保存用户输入的9个随机数
for i in {1..9}
do
  read -p "请输入数字:" tmp
  if echo $tmp |grep -qP "\D"; then
    echo "您输入的不是数字"
    exit
  fi
  num[$i]=$tmp
done
echo "您输入的数字序列为:${num[@]}"

# 冒泡排序
# 使用i控制进行几轮比较,使用j控制每轮比较的次数
# 对于9个数字而言,需要进行8轮比较,每进行一轮后,下一轮就可以少比较1次
for ((i=1;i<=8;i++));do
  echo "第${i}轮前,数字序列为:${num[@]}"
  for ((j=1;j<=$[9-i];j++));do
    echo "第${i}轮第${j}次前,数字序列为:${num[@]}"
    if [ ${num[j]} -gt ${num[j+1]} ]; then
      echo "本轮产生了交换, ${num[j]} <-> ${num[j+1]}"
      tmp=${num[j]}
      num[j]=${num[j+1]}
      num[j+1]=$tmp
    fi
  done
done
echo "经过排序后的数字序列为:${num[@]}"

根据进程所占物理内存的大小对进程进行排序(使用冒泡法)

#!/bin/bash
#功能描述:根据进程所占物理内存的大小对进程进行排序

tmpfile="/tmp/procs_mem_$$.txt"
echo $tmpfile
ps --no-headers -eo comm,rss > $tmpfile

bubble() {
  local i j
  local len=$1
  for ((i=1;i<=$[len-1];i++));do
    for ((j=1;j<=$[len-i];j++));do
      if [ ${mem[j]} -gt ${mem[j+1]} ];then
        tmp=${mem[j]}
        mem[j]=${mem[j+1]}
        mem[j+1]=$tmp
        tmp=${name[j]}
        name[j]=${name[j+1]}
        name[j+1]=$tmp
      fi
    done
  done
  echo "排序后进程序列:"
  echo "---------------------------------"
  echo "${name[@]}"
  echo "---------------------------------"
  echo "${mem[@]}"
  echo "---------------------------------"
}

i=1
while read proc_name proc_mem
do
  name[$i]=$proc_name
  mem[$i]=$proc_mem
  let i++
done < $tmpfile
rm -rf $tmpfile
bubble ${#mem[@]}

二,快速排序法

image.png
#!/bin/bash
#功能描述:采用分治思想改进快速排序算法

# 初始化一个数组
num=(15 66 897 27 105 698 1234)

# 定义一个可以递归调用的快速排序函数
quick_sort() {
  # 先判断需要进行比较的数字个数,$1是数组最左边的坐标,$2是数组最右边的坐标
  # 左边的坐标要小于右边的坐标,否则表示需要排序的数字只有一个,不需要排序
  if [ $1 -ge $2 ]; then
    return
  fi
  # 定义局部变量,base为基准数字,这里选择的是最左边的数字num[$1]
  # i表示左边的坐标,right表示右边的坐标(也可以使用i和j表示左右坐标)
  local base=${num[$1]}
  local left=$1
  local right=$2

  # 在要排序的数字序列中,比基准数大的数字放右边,比基准数字小的数字放左右
  while [ $left -lt $right ]; do
    # right向左移动,查找比基准数(base)小的元素
    while [[ ${num[right]} -ge $base && $left -lt $right ]]; do
      let right--
    done
    # left向右移动,查找比基准数(base)大的元素
    while [[ ${num[left]} -le $base && $left -lt $right ]]; do
      let left++
    done
    # 将left坐标元素和right坐标元素交换
    if [ $left -lt $right ]; then
      local tmp=${num[$left]}
      num[$left]=${num[right]}
      num[$right]=$tmp
    fi
  done

  # 将基准数字与left坐标元素交换
  num[$1]=${num[left]}
  num[left]=$base

  # 递归调用快速排序算法,对i左边的元素进行快速排序
  quick_sort $1 $[left-1]
  # 递归调用快速排序算法,对i右边的元素进行快速排序
  quick_sort $[left+1] $2
}

# 调用函数对数组进行排序,排序后输出数组的所有元素
quick_sort 0 ${#num[@]}
echo ${num[*]}

三,插入排序法

image.png
#!/bin/bash
# 功能描述: 插入排序算法演示,升序排序

for x in {1..5}; do
  read -p "请输入随机整数:" tmp
  num[$x]=$tmp
done

for ((i=1;i<=5;i++)); do
  tmp=${num[i]}
  j=$[i-1]
  while [[ $j -ge 0 && $tmp -lt ${num[j]} ]]; do
    num[j+1]=${num[j]}
    num[j]=$tmp
    let j--
  done
done
echo ${num[@]}

四,计数排序法

image.png
#!/bin/bash
# 功能描述: 计数排序算法,版本2

num=(2 6 983 678 345 23 99 23 124)

max=${num[0]}
for i in `seq $[${#num[@]}-1]`; do
  [ ${num[i]} -gt $max ] && max=${num[i]}
done
for i in `seq 0 $max`; do
  count[$i]=0
done

for i in `seq 0 $[${#num[@]}-1]`; do
  let count[${num[i]}]++
done

for i in `seq 0 $[${#count[@]}-1]`; do
  for j in `seq ${count[i]}`; do
    echo -n "$i "
  done
done
echo

相关文章

  • Shell入门笔记

    Shell脚本:Linux Shell脚本学习指南菜鸟教程 - Shell教程Linux入门 - Shell脚本是...

  • Shell 概述

    学习 Shell 主要包括的内容: Shell 脚本入门 Shell 变量 Shell 内置命令 Shell 运算...

  • 常用的排序算法

    常用的排序算法 常用的排序算法插入排序折半插入排序shell 排序冒泡排序选择排序快速排序基数排序归并排序堆排序K...

  • 尚硅谷大数据技术之Oozie

    第4章 Oozie的使用4.1 案例一:Oozie调度shell脚本目标:使用Oozie调度Shell脚本分步实现...

  • shell编程-交互 脚本菜单

    shell编程交互 脚本菜单 shell脚本的交互最常用的方式是使用菜单,通常是echo打印菜单出来。 上面的脚本...

  • Oozie的使用

    案例一:Oozie调度shell脚本 目标:使用Oozie调度Shell脚本分步实现: 创建工作目录 在oozie...

  • shell脚本

    shell入门 脚本格式入门 脚本以!/bin/bash开头,指定解析器 第一个shell脚本 需求 创建shel...

  • 希尔排序

    希尔排序 (Shell Sort) 算法原理 希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,...

  • (转)iOS使用shell脚本批量修改属性

    iOS使用shell脚本注入混淆内容iOS使用Shell脚本批量修改类名称iOS使用shell脚本批量修改属性 h...

  • 大数据学习-Linux Shell脚本快速入门

    批量处理数据,难免会有在集群中使用Shell脚本,自动跑程序,下面快速入门Shell脚本编程,本文解决一下问题: ...

网友评论

      本文标题:shell入门15-使用shell脚本实现常用排序算法

      本文链接:https://www.haomeiwen.com/subject/fkafcdtx.html