算法与正则表达式

Posted 正在迷途

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法与正则表达式相关的知识,希望对你有一定的参考价值。

一、算法

1、冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或从大到小不断的向前移动。

基本思想:

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

算法思路:

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

算法与正则表达式_算法

#!/bin/bash
arr=(52 66 32 77 1 22 95)
echo "老的数组顺序为:$arr[@]"
length=$#arr[*]
for ((a=1; a<length; a++))
do
for ((b=0; b<length-a; b++))
do
first=$arr[$b]
c=$[b + 1]
second=$arr[$c]
if [ $first -gt $second ]
then
temp=$first
arr[$b]=$second
arr[$c]=$temp
fi
done
done
echo "排序后的数组顺序为:$arr[@]"




算法与正则表达式_算法_02

算法与正则表达式_算法_03

2、直接选择排序

直接选择排序:与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些

基本思想:

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

算法与正则表达式_算法_04

#!/bin/bash
arr=(52 66 32 77 1 22 95)
echo "老的数组顺序为:$arr[@]"
length=$#arr[*]

for ((a=1; a<length; a++)) #定义比较的轮数,从1开始,轮数为数组长度-1
do
index=0 #定义当前比较轮中拥有最大值的元素下标的初始值为0
#!/bin/bash
arr=(52 66 32 77 1 22 95)
echo "老的数组顺序为:$arr[@]"
length=$#arr[*]

for ((a=1; a<length; a++)) #定义比较的轮数,从1开始,轮数为数组长度-1
do
index=0 #定义当前比较轮中拥有最大值的元素下标的初始值为0
#定义当前比较轮中的除了第一个元素的其他比较元素的下标的范围,会随着比较轮数的增加而减少,从1开始
for ((b=1; b<=length-a; b++))
do
XIAO=$arr[$b] #获取其他比较元素的值
DA=$arr[$index] #获取当前比较轮中最大元素的值
#通过拿其他比较元素的值与最大元素的值比较,获取当前比较轮的最大元素的下标
if [ $XIAO -gt $DA ]
then
index=$b
fi
done
#拿当前比较轮的最大元素的值与当前比较轮最后一个元素的值进行交换
last=$[$length - $a] #获取当前比较轮的最后一个元素的下标
temp=$arr[$last] #使用临时变量temp 获取当前轮的最后一个元素的值
arr[$last]=$arr[$index] #把当前轮中最大的元素的值赋给最后一个元素
arr[$index]=$temp #把原来最后一个元素的值赋给原最大的元素

done
echo "排序后的数组顺序为:$arr[@]"



算法与正则表达式_算法_05

算法与正则表达式_算法_06

算法与正则表达式_算法_07

这个直接选择排序与冒泡排序是很相似的,他们的区别是直接选择排序1轮只换位一次,与冒泡相比大大提高了速度。

3、反转排序

以相反的顺序把原有数组的内容重新排序

基本思想:

把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换

#!/bin/bash
arr=(1 2 3 4 5 6)
echo "排序前的数值顺序为: $arr[@]"
length=$#arr[@]
#拿对半分的前几个数作为参照物
for ((a=0; a<length/2; a++))
do
front=$arr[$a] #获取对半分前面的数值
backend=$arr[$length-1-$a] #获取对半分后面的值
#前后值进行交换
temp=$front
arr[$a]=$backend
arr[$length-1-$a]=$temp
done
echo "排序后的数值顺序为: $arr[@]"




算法与正则表达式_算法_08

算法与正则表达式_算法_09

二、一些命令(sort、uniq、tr、cut、split、eval )

1.sort 排序命令

sort命令:以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序;比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

格式:

sort [选项] 参数

常用选项:

  • -f:忽略大小写,会将小写字母都转换为大写字母来进行比较。
  • -b:忽略每行前面的空格。
  • -n:按照数字进行排序。
  • -r:反向排序。
  • -u:等同于uniq,表示相同的数据仅显示一行。
  • -t:指定字段分隔符,默认使用[Tab]键分隔。
  • -k:指定排序字段。
  • -o <输出文件>:将排序后的结果转存至指定文件。

不加选项默认按字母排序,首字母相同看第二个;小写在前,大写在后。

-f文件里行前有空格会排在前面

先建一个文件

算法与正则表达式_算法_10

算法与正则表达式_算法_11

算法与正则表达式_算法_12

2.uniq 去除重复行命令

用于报告或者忽略文件中连续的重复行,

以上是关于算法与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

攻破难啃的骨头-正则表达式(转)

text 正则表达式片段

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

算法与正则表达式

数据结构与算法之深入解析“正则表达式匹配”的求解思路与算法示例