i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

排序

Posted on 2016-12-13 13:57  shnoip  阅读(329)  评论(0)    收藏  举报

排序是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作;排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面,一个优秀的算法可以节省大量的资源。

一、选择排序
选择排序算法的基本思想是:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

排序 - 徐老师 - Pascal程序设计

例1、生成20个0到100之间的随机数,输出;用选择排序法从小到大排序后再次输出。

var
  s:array[1..20] of byte;
  i,j,t:byte;
begin
  randomize;
  for i:=1 to 20 do s[i]:=random(101);
  for i:=1 to 20 do write(s[i]:8);
  writeln;
  for i:=1 to 19 do
    for j:=i+1 to 20 do
      if s[i]>s[j] then begin
        t:=s[i];s[i]:=s[j];s[j]:=t;
      end;
  for i:=1 to 20 do write(s[i]:8);
end.

算法优化:
var
  s:array[1..20] of byte;
  i,j,t,k:byte;
begin
  randomize;
  for i:=1 to 20 do s[i]:=random(101);
  for i:=1 to 20 do write(s[i]:8);
  writeln;
  for i:=1 to 19 do begin
    k:=i;
    for j:=i+1 to 20 do
      if s[k]>s[j] then k:=j;
    if k<>i then begin
      t:=s[i];s[i]:=s[k];s[k]:=t;
    end;
  end;
  for i:=1 to 20 do write(s[i]:8);
end.

二、冒泡排序
冒泡排序算法的基本思想是:将待排序的数据序列看作竖直排列的一串“气泡”,值较小的数据比较轻,因此要往上浮。在冒泡排序算法中,我们要对这个“气泡”序列处理若干遍。所谓处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的记录的顺序是否正确。如果发现两个相邻记录的顺序不对,即“轻”的记录在下面,就交换他们的位置。显然,处理一遍之后,“最轻”的记录就浮到了最高位置。处理两遍之后,“次轻”的记录就浮到了次高位置。在作第二遍处理时,由于最高位置上的记录是“最轻”记录,所以不必检查。一般地,第i遍处理时,不必检查第i-1高位置的记录,因为经过前面i-1遍的处理,它们已经正确地排好序了。冒泡排序是一种稳定的排序方法。

排序 - 徐老师 - Pascal程序设计

例2、生成20个0到100之间的随机数,输出;用冒泡排序法从小到大排序后再次输出。

var
  s:array[1..20] of byte;
  i,j,t:byte;
begin
  randomize;
  for i:=1 to 20 do s[i]:=random(101);
  for i:=1 to 20 do write(s[i]:8);
  writeln;
  for i:=1 to 19 do
    for j:=1 to 20-i do
      if s[j]>s[j+1] then begin
        t:=s[j];s[j]:=s[j+1];s[j+1]:=t;
      end;
  for i:=1 to 20 do write(s[i]:8);
end.

三、快速排序
快速排序是对冒泡排序的一种改进,几乎是目前所有排序法中速度最快的方法。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

排序 - 徐老师 - Pascal程序设计 

例3、生成20个0到100之间的随机数,输出;用快速排序法从小到大排序后再次输出。

var
  s:array[1..20] of byte;
  i,j,t:byte;

procedure qs(l,r:byte);
var
  i,j,m,t:byte;
begin
  i:=l;j:=r;
  m:=s[(i+j) div 2];
  repeat
    while s[i]<m do inc(i);
    while s[j]>m do dec(j);
    if i<=j then begin
      t:=s[i];s[i]:=s[j];s[j]:=t;
      inc(i);dec(j);
    end;
  until i>j;
  if l<j then qs(l,j);
  if i<r then qs(i,r);
end;

begin
  randomize;
  for i:=1 to 20 do s[i]:=random(101);
  for i:=1 to 20 do write(s[i]:8);
  writeln;
  qs(1,20);
  for i:=1 to 20 do write(s[i]:8);
end.

四、插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法。插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

排序 - 徐老师 - Pascal程序设计

例4、生成20个0到100之间的随机数,输出;用插入排序法从小到大排序后再次输出。

var

  s:array[0..20] of byte;

  i,j,t:byte;

begin

  randomize;

  for i:=1 to 20 do s[i]:=random(101);

  for i:=1 to 20 do write(s[i]:8);

  writeln;

  for i:=2 to 20 do begin

    s[0]:=s[i];j:=i-1;

    while s[0]<s[j] do begin

      s[j+1]:=s[j];

      j:=j-1;

    end;

    s[j+1]:=s[0];

  end;

  for i:=1 to 20 do write(s[i]:8);

end.

作业:

1、zerojudge:
选择排序 a104、a225、c012
快速排序 d190
插入排序 c010