合肥
合肥奥数网

合肥站
奥数网

信息学竞赛常用算法与策略:分治策略(3)

合肥奥数网整理 2013-01-18 14:44:22

  例2:快速排序

      快速排序的基本思想是基于分治法的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:

  分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。

  递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。

  合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算L[p..r]就已排好序。

  这个解决流程是符合分治法的基本步骤的。因此,快速排序法是分治法的经典应用实例之一。

   程序代码如下:

  program kspv;

  const n=7;

  type

  arr=array[1..n] of integer;

  var

  a:arr;

  i:integer;

  procedure quicksort(var b:arr; s,t:integer);

  var i,j,x:integer;

    begin

    i:=s;j:=t;x:=b[i];

    repeat

     while (b[j]>=x) and (j>i) do j:=j-1;

     if j>i then begin  b[i]:=b[j];i:=i+1;end;

     while (b[i]<=x) and (i<j) do i:=i+1;

     if i<j then begin b[j]:=b[i];j:=j-1; end

    until i=j;

    b[i]:=x;

    i:=i+1;j:=j-1;

    if s<j then quicksort(b,s,j);

    if i<t then quicksort(b,i,t);

    end;

  begin

  write('input data:');

  for i:=1 to n do read(a[i]);

  writeln;

  quicksort(a,1,n);

  write('output data:');

  for i:=1 to n do write(a[i]:6);

  writeln;

  end.      

首页 上一页 下一页 尾页

相关推荐

点击查看更多
重点初中
首页 导航