曹钦翔吧 关注:32贴子:76
  • 3回复贴,共1

关于快速排序的速度问题

只看楼主收藏回复

快速排序一般被认为是时间效率最高的排序算法,但我们知道,它在最坏情况下时间复杂度是O(n^2)的,所以通常我们使用随机化的方法来避免最坏情况,这种方法往往是很有效的,对于高中阶段的信息学竞赛,这种方法也往往是能拿满分的(或接近满分),但对于某些特殊情况,如a1=a2=a3=......=an=C,的情况,无论如何随机化,都无法避免O(n^2)的最坏情况。这种情况下,往往基数排序的效果反而非常好。本人建议在ACM中使用堆排序,或合并排序,这两种算法是不受数据分布影响的!


IP属地:上海1楼2007-02-20 16:17回复
    哪有?此程序瞬秒。
    program Quick_Sort ;
    var a : array[0..1000000] of longint ;
     i , n : longint ;
    procedure qsort( s , t : longint ) ;
    var i , j , d , x : longint ;
    begin
     i := s ; j := t ; x := a[s+random(t-s+1)] ;
     repeat
     while ( a[i] < x ) do inc( i ) ;
     while ( a[j] > x ) do dec( j ) ;
     if ( i <= j )
     then begin
     d := a[i] ; a[i] := a[j] ; a[j] := d ;
     inc( i ) ; dec( j ) ;
     end ;
     until ( i > j ) ;
     if ( s < j )
     then qsort( s , j ) ;
     if ( i < t )
     then qsort( i , t ) ;
    end ;
    begin
     assign( input , '1.in' ) ; reset( input ) ;
     assign( output , '1.out' ) ; rewrite( output ) ;
     randomize ;
     readln( n ) ;
     for i := 1 to n do
     read( a[i] ) ;
     qsort( 1 , n ) ;
     for i := 1 to n do
     writeln(a[i]) ;
     close( input ) ;
     close( output ) ;
    end .


    IP属地:湖北2楼2009-03-14 22:38
    回复
      LS说的没错,我那个结论源于我早年Qsort写的不好。
      不过,如果比较操作耗时很大的时候,归并排序有优势。


      IP属地:上海3楼2009-03-14 22:59
      回复
        • 61.183.64.*
        恩……很赞同


        4楼2009-04-19 11:26
        回复