Guest User

Untitled

a guest
Sep 16th, 2012
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.21 KB | None | 0 0
  1. unit UnitMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ComCtrls, jpeg, ExtCtrls;
  8.  
  9. type
  10.   TFormMain = class(TForm)
  11.     EditSrc: TEdit;
  12.     btnSort: TButton;
  13.     Label2: TLabel;
  14.     cbSortType: TComboBox;
  15.     btnInitRnd: TButton;
  16.     MemoLog: TMemo;
  17.     btnSortAll: TButton;
  18.     brnPrint: TButton;
  19.     procedure FormCreate(Sender: TObject);
  20.     procedure btnInitRndClick(Sender: TObject);
  21.     procedure btnSortClick(Sender: TObject);
  22.     procedure btnSortAllClick(Sender: TObject);
  23.     procedure FormDestroy(Sender: TObject);
  24.     procedure brnPrintClick(Sender: TObject);
  25.   private
  26.     { Private declarations }
  27.   public
  28.     { Public declarations }
  29.   end;
  30.  
  31.   //массив
  32.   TArrayOfInteger = array of Integer;
  33.  
  34. const
  35.   //ограничим генерируемые числа
  36.   cMaxInt = 10000;
  37.  
  38. var
  39.   FormMain: TFormMain;
  40.   //массив
  41.   a: TArrayOfInteger;
  42.  
  43. //инициализация
  44. procedure ArrayInitRnd(var a: TArrayOfInteger; N: Integer);
  45. //вспомогательная функция копирования
  46. function ArrayCopy(a: TArrayOfInteger): TArrayOfInteger;
  47. //очистка
  48. procedure ArrayClear(a: TArrayOfInteger);
  49. //сортировки
  50. //Метод обмена (Метод пузырька)
  51. procedure BubbleSort(a: TArrayOfInteger; var Cmp,Sw: Integer; toShow: Boolean = true);
  52. //Метод вставок
  53. procedure InsertSort(a: TArrayOfInteger; var Cmp,Sw: Integer; toShow: Boolean = true);
  54. //Метод выбора
  55. procedure ChooseSort(a: TArrayOfInteger; var Cmp,Sw: Integer; toShow: Boolean = true);
  56. //Метод быстрой сортировки
  57. procedure QuickSort (a: TArrayOfInteger; var Cmp, Sw, Left, Right: Integer; toShow: Boolean = true);
  58. //Cmp - число сравнений
  59. //Sw - число перестановок
  60.  
  61. implementation
  62.  
  63. {$R *.dfm}
  64.  
  65. procedure ArrayInitRnd(var a: TArrayOfInteger; N: Integer);
  66. var
  67.   i: Integer;
  68. begin
  69.   //забиваем массив случайными числами
  70.   ArrayClear(a);
  71.   SetLength(a,N);
  72.   for i:=0 to N-1 do
  73.     a[i]:=Random(cMaxInt);
  74. end;
  75.  
  76. function ArrayCopy(a: TArrayOfInteger): TArrayOfInteger;
  77. var
  78.   i,N: Integer;
  79. begin
  80.   //копируем массив
  81.   N:=Length(a);
  82.   SetLength(Result,N);
  83.   for i:=0 to N-1 do
  84.     Result[i]:=a[i];
  85. end;
  86.  
  87. procedure ArrayClear(a: TArrayOfInteger);
  88. begin
  89.   SetLength(a,0);
  90. end;
  91.  
  92. procedure BubbleSort(a: TArrayOfInteger; var Cmp, Sw: Integer; toShow: Boolean);
  93. var
  94.   i,j,N,temp: Integer;
  95. begin
  96.   Cmp:=0;
  97.   Sw:=0;
  98.   N:=Length(a);
  99.   for i:=1 to N-1 do
  100.     for j:=N-1 downto i do
  101.       begin
  102.       Inc(Cmp);
  103.       if a[j-1]>a[j] then
  104.         begin
  105.         Inc(Sw);
  106.         temp:=a[j-1];
  107.         a[j-1]:=a[j];
  108.         a[j]:=temp;
  109.         end;
  110.       end;
  111.   //если надо, выводим полученный массив, чтобы убедиться, что все работает как надо
  112.   if toShow then
  113.     for i:=0 to N-1 do
  114.       FormMain.MemoLog.Lines.Add(IntToStr(a[i]));
  115. end;
  116.  
  117. procedure InsertSort(a: TArrayOfInteger; var Cmp, Sw: Integer; toShow: Boolean);
  118. var
  119.   i,j,N,temp: Integer;
  120. begin
  121.   Cmp:=0;
  122.   Sw:=0;
  123.   N:=Length(a);
  124.   for i:=1 to N-1 do
  125.     begin
  126.     temp:=a[i];
  127.     j:=i-1;
  128.     while (j>=0) and (temp<a[j]) do
  129.       begin
  130.       Inc(Cmp);
  131.       Inc(Sw);
  132.       a[j+1]:=a[j];
  133.       Dec(j);
  134.       end;
  135.     Inc(Cmp);
  136.     a[j+1]:=temp;
  137.     end;
  138.   //если надо, выводим полученный массив, чтобы убедиться, что все работает как надо
  139.   if toShow then
  140.     for i:=0 to N-1 do
  141.       FormMain.MemoLog.Lines.Add(IntToStr(a[i]));
  142. end;
  143.  
  144. procedure ChooseSort(a: TArrayOfInteger; var Cmp, Sw: Integer; toShow: Boolean);
  145. var
  146.   i,j,k,N,temp: Integer;
  147. begin
  148.   Cmp:=0;
  149.   Sw:=0;
  150.   N:=Length(a);
  151.   for i:=0 to N-2 do
  152.     begin
  153.     k:=i;
  154.     temp:=a[i];
  155.     for j:=i+1 to N-1 do
  156.       begin
  157.       Inc(Cmp);
  158.       if a[j]<temp then
  159.         begin
  160.         k:=j;
  161.         temp:=a[j];
  162.         Inc(Sw);
  163.         end;
  164.       end;
  165.     a[k]:=a[i];
  166.     a[i]:=temp;
  167.     end;
  168.   //если надо, выводим полученный массив, чтобы убедиться, что все работает как надо
  169.   if toShow then
  170.     for i:=0 to N-1 do
  171.       FormMain.MemoLog.Lines.Add(IntToStr(a[i]));
  172. end;
  173.  
  174. procedure QuickSort (a: TArrayOfInteger; var Cmp, Sw, Left, Right: Integer; toShow: Boolean);
  175. var
  176.   i,j,sred,temp,N:integer;
  177. begin
  178.    Cmp:=0;
  179.    Sw:=0;
  180.    N:=Length(a);
  181.    i:=left; j:=right; //установка начальных границ подмассива
  182.    sred:=a[(left+right) div 2]; //определение серединного элемента
  183.    repeat
  184.       while (a[i]<sred) do i:=i+1; //поиск слева элемента, большего опорного
  185.       while (a[j]>sred) do j:=j-1; //поиск справа элемента, меньшего опорного
  186.       if i<=j then
  187.       begin //обмениваем элементы и изменяем индексы
  188.          temp:=a[i]; a[i]:=a[j]; a[j]:=temp;
  189.          i:=i+1; j:=j-1;
  190.          Inc(Cmp);
  191.       end;
  192.    until i>j;
  193.    if left<j then QuickSort(a, left, j, toShow); //обработка левой половины
  194.    if i<right then QuickSort(a, i, right, toShow); //обработка правой половины
  195.    Inc(Sw);
  196.    //если надо, выводим полученный массив, чтобы убедиться, что все работает как надо
  197.    if toShow then
  198.       for i:=0 to High(a) do
  199.          FormMain.MemoLog.Lines.Add(IntToStr(a[i]));
  200. end;
  201.  
  202. procedure TFormMain.FormCreate(Sender: TObject);
  203. begin
  204.   ArrayClear(a);
  205. end;
  206.  
  207. procedure TFormMain.btnInitRndClick(Sender: TObject);
  208. var
  209.   i,aCount: Integer;
  210. begin
  211.   try
  212.     aCount:=StrToInt(EditSrc.Text);
  213.     ArrayInitRnd(a,aCount);
  214.     MemoLog.Lines.Clear;
  215.     for i:=0 to aCount-1 do
  216.       MemoLog.Lines.Add(IntToStr(a[i]));
  217.   except
  218.     ShowMessage('Введите целое число');
  219.   end;
  220. end;
  221.  
  222. procedure TFormMain.btnSortClick(Sender: TObject);
  223. var
  224.   Cmp,Sw: Integer;
  225.   b: TArrayOfInteger;
  226. begin
  227.   MemoLog.Lines.Clear;
  228.   //работаем с копией массива, чтобы его не потерять
  229.   b:=ArrayCopy(a);
  230.   case cbSortType.ItemIndex of
  231.   0:
  232.     begin
  233.     MemoLog.Lines.Add('Метод обмена (Метод пузырька)');
  234.     BubbleSort(b,Cmp,Sw);
  235.     MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  236.     MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  237.     MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  238.     end;
  239.   1:
  240.     begin
  241.     MemoLog.Lines.Add('Метод вставок');
  242.     InsertSort(b,Cmp,Sw);
  243.     MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  244.     MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  245.     MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  246.     end;
  247.   2:
  248.     begin
  249.     MemoLog.Lines.Add('Метод выбора');
  250.     ChooseSort(b,Cmp,Sw);
  251.     MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  252.     MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  253.     MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  254.     end;
  255.   3:
  256.     begin
  257.     MemoLog.Lines.Add('Метод быстрой сортировки');
  258.     QuickSort(b,Cmp,Sw);
  259.     MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  260.     MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  261.     MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  262.     end;
  263.   end;
  264.   SetLength(b,0);
  265. end;
  266.  
  267. procedure TFormMain.btnSortAllClick(Sender: TObject);
  268. var
  269.   Cmp,Sw: Integer;
  270.   b: TArrayOfInteger;
  271. begin
  272.   MemoLog.Lines.Clear;
  273.   //всякий раз работаем с копией массива, чтобы его не потерять
  274.   b:=ArrayCopy(a);
  275.   BubbleSort(b,Cmp,Sw,false);
  276.   MemoLog.Lines.Add('Метод обмена (Метод пузырька)');
  277.   MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  278.   MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  279.   MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  280.   SetLength(b,0);
  281.   b:=ArrayCopy(a);
  282.   InsertSort(b,Cmp,Sw,false);
  283.   MemoLog.Lines.Add('');
  284.   MemoLog.Lines.Add('Метод вставок');
  285.   MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  286.   MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  287.   MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  288.   SetLength(b,0);
  289.   b:=ArrayCopy(a);
  290.   ChooseSort(b,Cmp,Sw,false);
  291.   MemoLog.Lines.Add('');
  292.   MemoLog.Lines.Add('Метод выбора');
  293.   MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  294.   MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  295.   MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  296.   SetLength(b,0);
  297.   b:=ArrayCopy(a);
  298.   QuickSort(b,Cmp,Sw,false);
  299.   MemoLog.Lines.Add('');
  300.   MemoLog.Lines.Add('Метод быстрой сортировки');
  301.   MemoLog.Lines.Add('Длина массива: '+IntToStr(Length(a)));
  302.   MemoLog.Lines.Add('Сравнений: '+IntToStr(Cmp));
  303.   MemoLog.Lines.Add('Перестановок: '+IntToStr(Sw));
  304.   SetLength(b,0);
  305. end;
  306.  
  307. procedure TFormMain.FormDestroy(Sender: TObject);
  308. begin
  309.   ArrayClear(a);
  310. end;
  311.  
  312. procedure TFormMain.brnPrintClick(Sender: TObject);
  313. var
  314.   i: Integer;
  315. begin
  316.   MemoLog.Lines.Clear;
  317.   for i:=0 to Length(a)-1 do
  318.     MemoLog.Lines.Add(IntToStr(a[i]));
  319. end;
  320.  
  321. end.
Advertisement
Add Comment
Please, Sign In to add comment