切换到宽版
  • 17693阅读
  • 16回复

『求助』排序算法 [复制链接]

上一主题 下一主题
离线118140194
 
只看楼主 正序阅读 0 发表于: 2005-10-31
网上把排序算法超的很热,说的靠复赛必须背快排,为什么哦??举例说明下嘛,大牛们!!
离线sunlight
只看该作者 16 发表于: 2005-11-16
type sun=array[0..1000(或其它)]of longint(或byte,integer,int64,shortint,但注意的类型应随之改变
procedure qsort(var a:sun;m,n:integer);
  var i:integer;
  function slipt(var a:sun;m,n:integer):integer;
    var i,j,k:integer;
      t:longint;
    begin
    k:=n-m+1;
    k:=random(k)+m;
    t:=a[k];a[k]:=a[m];
    i:=m;j:=n;
    while i<>j do
      BEGIN
        while (i<j)and(a[j]>=t)do dec(j);
        if i<j then
        begin
        a:=a[j];inc(i);
        while (a<=t)and(i<j) do inc(i);
        if i<j then begin a[j]:=a;dec(j) end
        end
      END;
    a:=t;
    slipt:=i;
    end;
  BEGIN
    if n>m then begin
    i:=slipt(a,m,n);
    qsort(a,m,i-1);
    qsort(a,i+1,n)
    end
  END
;
这是快速排序,时间复杂度为O(nlogn)!与9楼一样
[ 此贴被sunlight在2005-11-16 09:26重新编辑 ]
离线水的味道
只看该作者 15 发表于: 2005-11-15
我的眼球^^^^^^^^^^^^^^^^^^^^
离线archimedes

只看该作者 14 发表于: 2005-11-15
我喜欢用BubbleSort
for i:=1 to n do
for j:=i+1 to n-1 do
  begin t:=a; a:=a[j]; a[j]:=t; end;
离线archimedes

只看该作者 13 发表于: 2005-11-15
真傻!还用Huffmann树
很显然,每次合并两个结点以后,得到的大小是严格递增的,于是我们可以维护两个表,一个是原数字A,一个是新加入的数字B。这样,每次就一定是在A和B的头部取数,在A和B的尾部删除。这样,时间复杂度就降到了O(n)。因为a <= 20000,所以排序也可以用o(20000)的方法来实现,整体时间复杂度为O(n)。
多好的算法!
线性的!
离线archimedes

只看该作者 12 发表于: 2005-11-10
example 中 QSORT 是快排
离线嚣声逆迹
只看该作者 11 发表于: 2005-11-05
去年的2题仿佛快排也会超时几个测试点,据说那题用堆排不错
离线byteyang
只看该作者 10 发表于: 2005-11-03
晕,楼上的程序......
离线118140194
只看该作者 9 发表于: 2005-11-02
program qs(input,output);
type
  list=array[1..8] of integer;
var
  a:list;i:integer;
function partition(p,r:integer;var l:list):integer;
  var
    pivot,i,j,zhong:integer;
  begin
    pivot:=5;
    i:=p-1;
    j:=r+1;
    {while do
    begin   }
      repeat
        dec(j);
      until l[j]<=pivot;
      repeat
        inc(i);
      until l>=pivot;
      if i<j
        then begin
        zhong:=l;
        l:=l[j];
        l[j]:=zhong;
          end
        else if j<>r
        then partition:=j
        else partition:=j-1;
    { end;}
  end;
procedure sort(p,r:integer;var l:list);
  var
    q:integer;
  begin
    if p=r
    then exit
    else begin
      q:=partition(p,r,l);
      sort(p,q,l);
      sort(q+1,r,l);
        end;
  end;
begin
  a[1]:=5;a[2]:=3;a[3]:=2;a[4]:=6;a[5]:=4;a[6]:=1;a[7]:=3;a[8]:=7;
  sort(1,8,a);
  for i:=1 to 8 do
    write(a,' ');
  readln;
end.

我这个程序真么是错的哦,哪个帮我找下原因嘛!!谢谢牛兄!!
离线118140194
只看该作者 8 发表于: 2005-10-31
请问是EXAMPLE的哪个程序里面有快排哦??
快速回复
限100 字节
 
上一个 下一个