快排和冒泡

  1
2 array=( 5 2 7 3 8 1 ) 3 total=${#array[@]} 4 5 ascend(){ 6 echo $3 7 for (( i=0;i<=$total-2;i++ )) 8 do 9 for(( j=$total-1;j>$i;j-- )) 10 do 11 if [[ ${array[j]} -gt ${array[j-1]} ]]; 12 then 13 tmp=${array[j]} 14 array[j]=${array[j-1]} 15 array[j-1]=$tmp 16 fi 17 done 18 done 19 } 20 ascend "${array[@]}" 21 22 echo ${array[*]}

注意点1)主要是关于传递的参数方法,类似shell的$@和$*区别 

#!/bin/sh
function demo1
{
    echo "Number of params: $#"
    echo "Params: $@"
    while [ $# -gt 0 ]
    do
        echo $1
        shift
    done
}

paramArray=(a "bb" "cc  dd" "ee   ff   gg")
echo "-----Call function with \"\${paramArray[@]}\"-----"
demo1 "${paramArray[@]}"
echo "-----Call function with \"\${paramArray[*]}\"-----"
demo1 "${paramArray[*]}"
echo "-----Call function with \${paramArray[@]}-----"
demo1 ${paramArray[@]}
echo "-----Call function with \${paramArrya[*]}-----"
demo1 ${paramArray[*]}


脚本在CentOS 6.0中的运行结果:
-----Call function with "${paramArray[@]}"-----
Number of params: 4
Params: a bb cc  dd ee   ff   gg
a
bb
cc dd
ee ff gg
-----Call function with "${paramArray[*]}"-----
Number of params: 1
Params: a bb cc  dd ee   ff   gg
a bb cc dd ee ff gg
-----Call function with ${paramArray[@]}-----
Number of params: 7
Params: a bb cc dd ee ff gg
a
bb
cc
dd
ee
ff
gg
-----Call function with ${paramArrya[*]}-----
Number of params: 7
Params: a bb cc dd ee ff gg
a
bb
cc
dd
ee
ff
gg

 

注意点2)shell数组的一些基础知识,来自chinaunix

数组的声明:
array[key]=value # array[0]=one,array[1]=two
declare -a array # array被当作数组名
array=( value1 value2 value3 ... )
array=( [1]=one [2]=two [3]=three ... )

# echo ${array[0|@|*]},把array变量当作数组来处理,但数组元素只有字符串本身
array="one two three"

数组的访问:
${array[key]} # ${array[1]}

数组的删除
unset array[1] # 删除数组中第一个元素
unset array # 删除整个数组

计算数组的长度:
${#array}
${#array[0]} #同上, ${#array[*]} 、${#array[@]}。注意同#{array:0}的区别

数组的提取
从尾部开始提取:
array=( [0]=one [1]=two [2]=three [3]=four )
${array[@]:1} # two three four,除掉第一个元素后所有元素,那么${array[@]:0}表示所有元素
${array[@]:0:2} # one two
${array[@]:1:2} # two three

子串删除
[root@localhost dev]# echo ${array[@]:0}
one two three four
 [root@localhost dev]# echo ${array[@]#t*e} # 左边开始最短的匹配:"t*e",这将匹配到"thre"
one two e four
 [root@localhost dev]# echo ${array[@]##t*e} # 左边开始最长的匹配,这将匹配到"three"
 [root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
 [root@localhost dev]# echo ${array[@] %o} # 从字符串的结尾开始最短的匹配
one tw three four
 [root@localhost dev]# echo ${array[@] %%o} # 从字符串的结尾开始最长的匹配
one tw three four

子串替换
[root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
第一个匹配到的,会被删除
[root@localhost dev]# echo ${array[@] /o/m}
mne twm three fmur
所有匹配到的,都会被删除
[root@localhost dev]# echo ${array[@] //o/m}
mne twm three fmur
没有指定替换子串,则删除匹配到的子符
[root@localhost dev]# echo ${array[@] //o/}
ne tw three fur
替换字符串前端子串
[root@localhost dev]# echo ${array[@] /#o/k}
kne two three four
替换字符串后端子串
[root@localhost dev]# echo ${array[@] /%o/k}
one twk three four

 

冒泡排序

自己研究半天,下面这种写法是最容易直观理解的。相比算法导论和其他写法,感觉更适合记忆。

int quicksort(int l,int r,int a[]){

int i=l;
int j=r-1;

if(l<r){//else是递归出口
        while(i<j){//此一遍+while后的swap后,左右大小分开
                while(a[i]<a[r] && i<r)i++;
                while(a[j]>a[r] && j>l)j--;
                if(i<j)
                {
                        swap(&a[i],&a[j]);
                        i++;
                        j--;
                }
        }
                swap(&a[i],&a[r]);
                quicksort(l,i-1,a);
                quicksort(i+1,r,a);
}else//可以不写
        return;
}

  

你可能感兴趣的:(冒泡)