排序法

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;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章