写了个快速排序的脚本练练手,顺便熟悉一下awk中的递归函数的写法。
特点:能对字符串及数字进行排序:
qsort:
#! /usr/bin/awk
BEGIN {
FS="[ ]";
}
{
arr[len++]=$0;
}
END{
qsort(arr,0,len);
printfile(arr,len+1);
exit 0;
}
function qsort(array , p , r , t , i ,x)
{
if (p < r) {
x=array[p];
i = p;
j = r+1;
while(array[--j] > x );
while(i < j) {
t = array;
array=array[j];
array[j]=t;
while(array[++i] < x );
while(array[--j] > x );
}
qsort(array, p , j);
qsort(array, j + 1 , r);
}
}
function printfile(array,len,k)
{
for(k=1;k<len;k++)
{
print array[k];
}
}
用法:
awk -f qsort datafile
xlink 回复于:2006-04-11 23:25:04
向dbcat学习,半年以后能读懂就好了。
寂寞烈火 回复于:2006-04-12 00:20:23
向dbcat学习,N年以后能读懂就好了。
god_kiss 回复于:2006-04-12 10:51:13
函数中:
function qsort(array , p , r , t , i ,x)
{
if (p < r) {
x=array[p];
i = p;
j = r+1;
[color=Red] while(array[--j] > x );[/color] while(i < j) {
t = array;
array=array[j];
array[j]=t;
[color=Red]while(array[++i] < x );
while(array[--j] > x );[/color]
}
qsort(array, p , j);
qsort(array, j + 1 , r);
}
}
标记红色的部分是怎么退出循环的?
没有action啊?
waker 回复于:2006-04-12 10:52:40
while(array[--j] > x );
当array[--j]<=x的时候不就退出了
god_kiss 回复于:2006-04-12 11:19:38
……这个当然,但是怎么实现array[--j]<=x呢?当array[--j] > x 时,此while没有action,不就死在那了吗?
god_kiss 回复于:2006-04-12 11:27:30
:mrgreen:,我的错,现在明白了。谢谢waker
li.he 回复于:2006-04-12 12:03:07
啥时候明白我就成仙了
creat7151 回复于:2006-04-12 13:39:57
汗,天书一篇
hlm5097 回复于:2006-04-12 14:02:02
学习!
johnny_jiang 回复于:2006-04-12 17:28:40
This is the algorithm of quicksort
dl318 回复于:2006-04-14 16:56:22
学习学习,强人啊!
lileding 回复于:2006-04-15 18:00:21
呵呵,ms那个awk就是干了读入的工作哎
admirer 回复于:2006-04-16 13:52:07
强!
半年来老夫已经忘的差不多了!学习...........
sword.ch 回复于:2006-04-16 23:18:59
while(array[++i] < x );
while(array[--j] > x );
如果i=r时,始终array[++i] < x会出现什麽结果呢?
这个循环能不能退出。有没有知道的解释一下.
[ 本帖最后由 sword.ch 于 2006-4-16 23:27 编辑 ]
gawk 回复于:2006-04-19 20:53:00
来偷学的
qunlee 回复于:2006-04-25 09:03:16
楼上的,偷不如偷不着吧,嘿嘿~
|