• delphi排序算法


    1.冒泡排序:从小到大

    procedure BubbleSort(var N:array of integer);
    var
      I,J,IntTemp:integer;
    begin
      for I := 0 to High(N) do
      begin
        for J := 0 to High(N)-1 do
        begin
          if N[J]>N[J+1] then
          begin
            IntTemp:=N[J];
            N[J]:=N[J+1];
            N[J+1]:=IntTemp;
          end;
        end;
      end;
    end;

    2.选择排序:从小到大

    procedure SelectSort(var N:array of integer);
    var
      I,J,K,IntTemp:integer;
    begin
      for I := 0 to High(N)-1 do
      begin
        IntTemp:=N[I];
        K:=I;
        for J := I+1 to High(N) do
        begin
          if IntTemp>N[J] then
          begin
            K:=J;
            IntTemp:=N[J];
          end;
        end;
        if K<>I then
        begin
          N[K]:=N[I];
          N[I]:=IntTemp;
        end;
      end;
    end;

    3.插入排序:从小到大

    procedure InsertSort(var N:array of integer);
    var
      I,J,IntTemp:integer;
    begin
       for I := 1 to High(N) do
       begin
         for J := I downto 1 do
         begin
           if N[J-1]>N[J] then
           begin
             IntTemp:=N[J-1];
             N[J-1]:=N[J];
             N[J]:=IntTemp;
           end;
         end;
       end;
    end;

    4.希尔排序:从小到大

    procedure ShellSort(var N:array of integer);
    var
      I,J,K,IntTemp:integer;
    begin
      K:=High(N) div 2;
      while K>0 do
      begin
        for I := K to High(N) do
        begin
           J:=I;
           while (J>=K)and(N[J-K]>N[J]) do
           begin
             IntTemp:=N[J-K];
             N[J-K]:=N[J];
             N[J]:=IntTemp;
             J:=J-K;
           end;
        end;
        K:=K div 2;
      end;
    end;

    5.快速排序

    procedure QuickSort(var N: array of integer; L, R: integer);
    var
      I, J, IntTemp: integer;
    begin
      if L < R then
      begin
        I := L;
        J := R;
        IntTemp := N[I];
        while I < J do
        begin
          while (I < J) and (N[J] >= IntTemp) do
          begin
            J := J - 1;
          end;
          if I < J then
            N[I] := N[J];
          while (I < J) and (N[I] <= IntTemp) do
          begin
            I := I + 1;
          end;
          if I < J then
            N[J] := N[I];
        end;
        N[I] := IntTemp;
        QuickSort(N, L, I - 1);
        QuickSort(N, I + 1, R);
      end;
    end;

    6.归并排序:

    要先声明

    type
    TIntArr=array of integer;

    procedure Merge(var X, Y: array of integer; L, M, R: integer);
    var
      I, J: integer;
    begin
      I := L;
      J := M + 1;
      while (L <= M) and (J <= R) do
      begin
        if X[L] > X[J] then
        begin
          Y[I] := X[J];
          J := J + 1;
        end
        else
        begin
          Y[I] := X[L];
          L := L + 1;
        end;
        I := I + 1;
      end;
      while L <= M do
      begin
        Y[I] := X[L];
        I := I + 1;
        L := L + 1;
      end;
      while J <= R do
      begin
        Y[I] := X[J];
        I := I + 1;
        J := J + 1;
      end;
    end;
    
    procedure MergeSort(var X, Y: TIntArr);
    var
      IntLength, IntLen, IntLen_m, I: integer;
      Tmp: TIntArr;
    begin
      IntLength := high(X) + 1;
      IntLen := 1;
    
      while IntLen < IntLength do
      begin
        IntLen_m := IntLen;
        IntLen := IntLen * 2;
        I := 0;
        while I + IntLen < IntLength do
        begin
          Merge(X, Y, I, I + IntLen_m - 1, I + IntLen - 1);
          I := I + IntLen;
        end;
        if I + IntLen_m < IntLength then
        begin
          Merge(X, Y, I, I + IntLen_m - 1, IntLength - 1);
        end;
    
        Tmp := X;
        X := Y;
        Y := Tmp;
      end;
    end;

    7.堆排序

    procedure HeapAdjust(var N: array of integer; I, IntLen: integer);
    var
      IntTmp, IntChild: integer;
    begin
      IntTmp := N[I];
      IntChild := 2 * I + 1;
      while IntChild < IntLen do
      begin
        if (IntChild + 1 < IntLen) and (N[IntChild] < N[IntChild + 1]) then
        begin
          IntChild := IntChild + 1;
        end;
        if N[I] < N[IntChild] then
        begin
          N[I] := N[IntChild];
          I := IntChild;
          IntChild := 2 * I + 1;
        end
        else
        begin
          break;
        end;
        N[I] := IntTmp;
      end;
    end;
    
    procedure BuildHeap(var N: array of integer);
    var
      I: integer;
    begin
      for I := high(N) div 2 downto 0 do
      begin
        HeapAdjust(N, I, High(N) + 1);
      end;
    end;
    
    procedure HeapSort(var X: array of integer);
    var
      I, IntTmp: integer;
    begin
      BuildHeap(X);
      for I := high(X) downto 0 do
      begin
        IntTmp := X[I];
        X[I] := X[0];
        X[0] := IntTmp;
        HeapAdjust(X, 0, I);
      end;
    end;

    在数据量大于100W以上,建议用归并或堆排序以获得更快的速度,并可避免由于大量递归调用引的的stack over flow错误。

  • 相关阅读:
    【力扣 064】739. 每日温度
    【力扣 066】 503. 下一个更大元素 II
    dotnet 读 WPF 源代码笔记 渲染收集是如何触发
    dotnet 6 使用 Obfuscar 进行代码混淆
    dotnet 修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库
    dotnet 6 使用 DependentHandle 关联对象生命周期
    dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别
    set查找
    二元谓词
    set自定义数据类型指定排序规则
  • 原文地址:https://www.cnblogs.com/sun998/p/6394958.html
Copyright © 2020-2023  润新知