排序法

1、快速排序法(这个最容易迷惑){=====================================================================

函数名:QuickSort

作者:pyg

日期:2000-01-01

功能:快速排序法

输入参数:A 待排序数组;iLo 数组最小下标;iHi:数组最大下标

返回值:无

修改记录:2008-07-01

=====================================================================}

procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);

var

  Lo, Hi, Mid, T: Integer;

begin

  Lo := iLo;

  Hi := iHi;

  Mid := A[(Lo + Hi) div 2];  //数组中间位置的值,注意A下标从0开始计算

  repeat

    //如果左边的A[Lo]小于中间值则此值不动下标+1,直到找到大于或等于中间值,用于与右边的调换

    while A[Lo] < Mid do Inc(Lo);

    //如果左边的A[Hi]大于中间值则此值不动,下标-1,直到找到小于或等于中间值,用于与左边的调换

    while A[Hi] > Mid do Dec(Hi);

    //如果上边的操作尚未循环到中间位置则,将上边所得的左右值进行交换

    if Lo <= Hi then

    begin

      T := A[Lo];

      A[Lo] := A[Hi];

      A[Hi] := T;

      //交换后,继续向中间位置靠拢,下标做相应移动

      Inc(Lo);

      Dec(Hi);

    end;

  {当左边移动的下标大于右边的下标时,代表一轮排序结束,此时左边为小于中间位置的值部分

   右边为大于中间位置值的部分,两部分数组个数不一定对称(相等)

  }

  until Lo > Hi;

  //递归对做半部分进行再次排序

  if Hi > iLo then QuickSort(A, iLo, Hi);

  {递归对做右部分进行再次排序(此时的Lo,iHi值为第一轮排序结束的值,不会因为左半部分的再次排序而改变

  ,因为递归调用时,所传的变量为函数内部的变量}

  if Lo < iHi then QuickSort(A, Lo, iHi);

end;

2、冒泡排序法(2种接口)

procedure BubbleSort(var Num: TArray; NumSize: Integer);

var

  pass, I, Tmp, NumTmp: Integer;

begin

  //1.for实现

  for pass := 1 to NumSize - 1 do

  begin

    Tmp := NumSize - pass;

    for I := 0 to Tmp - 1 do

    begin

      if Num[I] > Num[I + 1] then

      begin

        NumTmp := Num[I];

        Num[I] := Num[I + 1];

        Num[I + 1] := NumTmp;

      end;

    end;

  end;   

  //2.while实现

{  pass := 1;

  I := 0;

  SetLength(Num, NumSize);

  while pass < NumSize do //共进行NumSize - 1 轮

  begin

    Tmp := NumSize - pass;

    while I < Tmp do     //比较一轮

    begin

      if Num[I] > Num[I + 1] then

      begin

        NumTmp := Num[I];

        Num[I] := Num[I + 1];

        Num[I + 1] := NumTmp;

      end;

      Inc(I);

    end;

    Inc(pass);

  end;  }

end;

procedure BubbleSort2(var SortArray: array of Integer);

var

  I, J, Tmp: Integer;

begin

  for I := High(SortArray) downto Low(SortArray) do

  begin

    for J := Low(SortArray) to High(SortArray) - 1 do

    begin

      if SortArray[J] > SortArray[J + 1] then

      begin

        Tmp := SortArray[J];

        SortArray[J] := SortArray[J + 1];

        SortArray[J + 1] := Tmp;

      end;

    end;

  end;

end;

3、插入排序法(两种接口)

procedure InsertSort(var Num: TArray; NumSize: Integer);

var

  Inserter, Index, I: Integer;

begin

  for I := 1 to NumSize - 1 do   //共执行NumSize - 1轮

  begin

    Inserter := Num[I];

    Index := I - 1;

    while (Index >= 0) and (Inserter < Num[Index]) do //寻找插入点

    begin

      Num[Index + 1] := Num[Index]; //后挪一个位置

      Index := Index - 1;

    end;

    Num[Index + 1] := Inserter;  //插入

  end;

end;

procedure InsertSort2(var Num: Array of Integer);

var

  Inserter, Index, I: Integer;

begin

  for I := Low(Num) + 1 to High(Num) do

  begin

    Inserter := Num[I];

    Index := I - 1;

    while (Index >= 0) and (Inserter < Num[Index]) do

    begin

      Num[Index + 1] := Num[Index];

      Index := Index - 1;

    end;

    Num[Index + 1] := Inserter;    

  end;

end;

4、判断素数(附加一个,呵呵,面试总整出这个)

function IsPrime(aNum: Integer): Boolean;

var

  I, Tmp: Integer;

begin

  Result := True;

  if aNum <= 1 then

  begin

    Result := False;

    exit;

  end;

  Tmp := Trunc(Sqrt(aNum));

  //1.for实现  

  for I := 2 to Tmp do

  begin

    if aNum mod I = 0 then

    begin

      Result := False;

      break;

    end;

  end;

  //2.while 实现

  {I := 2;

  while I <= Tmp do

  begin

    if aNum mod I = 0 then

    begin

      Result := False;

      Break;

    end;

    Inc(I);

  end; }

end;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值