首页 > 学技术 > 技术网文 > Linux Shell > 正文

[保留] [小函数] awk 版快速排序


来源 chinaunix.net 酷勤网整理

写了个快速排序的脚本练练手,顺便熟悉一下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

楼上的,偷不如偷不着吧,嘿嘿~




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=736994
转载请注明作者名及原文出处



收藏本页到: