Advertisement
stepan12123123123

Sort

Dec 18th, 2022
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.29 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
  9.  
  10. type
  11.  
  12.   {LIST}
  13.   {Тип основных данных.}
  14.   {Указатель на элемент списка.}
  15.   TPElem = ^TElem;
  16.   {Элемент списка.}
  17.   TElem = record
  18.     Data : integer; {Основные данные.}
  19.     PointNext : TPElem; {Указатель на следующий элемент.}
  20.   end;
  21.   {Список.}
  22.   TDList = record
  23.   PointBeg, PointEnd : TPElem; {Указатели на первый и на последний элементы списка.}
  24.    end;
  25.    { TForm1 }
  26.   TForm1 = class(TForm)
  27.     Button1: TButton;
  28.     Button2: TButton;
  29.     Button3: TButton;
  30.     Button4: TButton;
  31.     Edit1: TEdit;
  32.     ListBox1: TListBox;
  33.     ListBox2: TListBox;
  34.     ListBox3: TListBox;
  35.     procedure Button1Click(Sender: TObject);
  36.     procedure Button2Click(Sender: TObject);
  37.     procedure Button3Click(Sender: TObject);
  38.     procedure Button4Click(Sender: TObject);
  39.     procedure Edit1Change(Sender: TObject);
  40.   private
  41.  
  42.   public
  43.   end;
  44.  
  45. var
  46.   Form1: TForm1;
  47.  
  48. implementation
  49. var
  50. n : integer;
  51. List1, List2 : TDList;
  52. Data : integer;
  53. {$R *.lfm}
  54.  
  55. { TForm1 }
  56. {Create list}
  57. procedure Create_Zero_List(var a: TDList; n : integer);
  58. var
  59. i : integer;
  60. Elem : TPElem;
  61. begin
  62.   a.PointEnd := nil;
  63.   a.PointBeg := nil;
  64.   for i := 0 to n-1 do begin
  65.     New(Elem);
  66.     Elem^.Data := 0;
  67.     Elem^.PointNext := nil;
  68.     if a.PointBeg = nil then begin
  69.        a.PointBeg := Elem;
  70.     end
  71.     else begin
  72.        a.PointEnd^.PointNext := Elem;
  73.     end;
  74.     a.PointEnd := Elem;
  75.   end;
  76. end;
  77. function Slianie(var list1, list2, a: TPElem; n1, n2: integer): TPElem;
  78. var s1 : TDList;
  79. s : TPElem;
  80. n3: integer;
  81. begin
  82.   n3 := n1 + n2;
  83.   Create_Zero_List(s1,n3);
  84.   s := s1.PointBeg;
  85.   while (list1 <> nil) and (list2 <> nil) do begin
  86.     if list1^.Data <= list2^.Data then begin
  87.        s^.Data := list1^.Data;
  88.        s := s^.PointNext;
  89.        list1 := list1^.PointNext;
  90.     end
  91.     else begin
  92.        s^.Data := list2^.Data;
  93.        s := s^.PointNext;
  94.        list2 := list2^.PointNext;
  95.       end;
  96.   end;
  97.   if list1 = nil then begin
  98.       while list2 <> nil do begin
  99.         s^.Data := list2^.Data;
  100.         s := s^.PointNext;
  101.         list2 := list2^.PointNext;
  102.       end;
  103.   end
  104.   else begin
  105.      while list1 <> nil do begin
  106.        s^.Data := list1^.Data;
  107.        s := s^.PointNext;
  108.        list1 := list1^.PointNext;
  109.      end;
  110.   end;
  111.   Slianie := s1.PointBeg;
  112. end;
  113. procedure MergeSort(var a: TPElem; n : integer);
  114. var p1, p2: TPElem;
  115. k, i : integer;
  116. begin
  117.   if n > 1 then begin
  118.      k := n div 2;
  119.      p1 := a;
  120.      for i := 1 to k-1 do begin
  121.        p1 := p1^.PointNext;
  122.      end;
  123.      p2 := p1^.PointNext;
  124.      p1^.PointNext := nil;
  125.      p1 := a;
  126.      MergeSort(p1, k);
  127.      MergeSort(p2, n-k);
  128.      a := Slianie(p1, p2, a, k, n-k);
  129.   end;
  130. end;
  131.  
  132.  
  133. procedure Create_List(var a: TDList; n : integer);
  134. var
  135. i : integer;
  136. Elem : TPElem;
  137. begin
  138.   randomize;                          
  139.   a.PointEnd := nil;
  140.   a.PointBeg := nil;
  141.   for i := 0 to n-1 do begin
  142.     New(Elem);
  143.     Elem^.Data := random(1999)-999;
  144.     Elem^.PointNext := nil;
  145.     if a.PointBeg = nil then begin
  146.        a.PointBeg := Elem;
  147.     end
  148.     else begin
  149.        a.PointEnd^.PointNext := Elem;
  150.     end;
  151.     a.PointEnd := Elem;
  152.   end;
  153. end;
  154. procedure Create_List_Order(var a: TDList; n : integer);
  155. var
  156. i,k : integer;
  157. Elem : TPElem;
  158. begin
  159.   randomize;
  160.   k := -1000;
  161.   a.PointEnd := nil;
  162.   a.PointBeg := nil;
  163.   for i := 0 to n-1 do begin
  164.     New(Elem);
  165.     Elem^.Data := random(1999)-999;
  166.     while Elem^.Data < k do begin
  167.         Elem^.Data := random(1999)-999;
  168.     end;
  169.     k := Elem^.Data;
  170.     Elem^.PointNext := nil;
  171.     if a.PointBeg = nil then begin
  172.        a.PointBeg := Elem;
  173.     end
  174.     else begin
  175.        a.PointEnd^.PointNext := Elem;
  176.     end;
  177.     a.PointEnd := Elem;
  178.   end;
  179. end;
  180.  
  181. procedure Writer1(var a : TDList; n : integer);
  182. var Elem : TPElem;
  183. begin
  184.   Form1.ListBox1.Clear;
  185.   if n <= 40 then begin
  186.   Elem := a.PointBeg;
  187.   if Elem = nil then begin
  188.      Form1.ListBox1.Items.Add('--');
  189.      end
  190.   else begin
  191.     While Elem <> nil do begin
  192.       if Elem <> a.PointEnd then begin
  193.          Form1.ListBox1.Items.Add(IntToStr(Elem^.Data));
  194.          Elem := Elem^.PointNext;
  195.       end
  196.       else begin
  197.         Form1.ListBox1.Items.Add(IntToStr(Elem^.Data));
  198.         break;
  199.       end;
  200.     end;
  201.   end;
  202.   end
  203.   else
  204.      Form1.ListBox1.Items.Add('SOCHI KLASS!!!');
  205. end;
  206. procedure Writer2(var a : TDList; n : integer);
  207. var Elem : TPElem;
  208. begin
  209.   Form1.ListBox2.Clear;
  210.   if n <= 40 then begin
  211.   Elem := a.PointBeg;
  212.   if Elem = nil then begin
  213.      Form1.ListBox2.Items.Add('--');
  214.      end
  215.   else begin
  216.     While Elem <> nil do begin
  217.       if Elem <> a.PointEnd then begin
  218.          Form1.ListBox2.Items.Add(IntToStr(Elem^.Data));
  219.          Elem := Elem^.PointNext;
  220.       end
  221.       else begin
  222.         Form1.ListBox2.Items.Add(IntToStr(Elem^.Data));
  223.         break;
  224.       end;
  225.     end;
  226.   end;
  227.   end
  228.   else
  229.      Form1.ListBox2.Items.Add('SOCHI KLASS!!!');
  230. end;
  231. procedure Writer3(var a : TDList; n : integer);
  232. var Elem : TPElem;
  233. begin
  234.   Form1.ListBox3.Clear;
  235.   if n <= 40 then begin
  236.   Elem := a.PointBeg;
  237.   if Elem = nil then begin
  238.      Form1.ListBox3.Items.Add('--');
  239.      end
  240.   else begin
  241.     While Elem <> nil do begin
  242.       if Elem <> a.PointEnd then begin
  243.          Form1.ListBox3.Items.Add(IntToStr(Elem^.Data));
  244.          Elem := Elem^.PointNext;
  245.       end
  246.       else begin
  247.         Form1.ListBox3.Items.Add(IntToStr(Elem^.Data));
  248.         break;
  249.       end;
  250.     end;
  251.   end;
  252.   end
  253.   else
  254.      Form1.ListBox3.Items.Add('SOCHI KLASS!!!');
  255. end;
  256. procedure TForm1.Button1Click(Sender: TObject);
  257. begin
  258.    n := StrToInt(Edit1.Text);
  259.    Create_List(List1, n);
  260.    Writer1(List1, n);
  261. end;
  262.  
  263. procedure TForm1.Button2Click(Sender: TObject);
  264. begin
  265.     n := StrToInt(Edit1.Text);
  266.    Create_List_Order(List2, n);
  267.    Writer2(List2, n)
  268. end;
  269.  
  270. procedure TForm1.Button3Click(Sender: TObject);
  271. begin
  272.   n := StrToInt(Edit1.Text);
  273.   MergeSort(List1.PointBeg, n);
  274.   Writer3(List1, n);
  275. end;
  276.  
  277. procedure TForm1.Button4Click(Sender: TObject);
  278. begin
  279.   Close;
  280. end;
  281.  
  282. procedure TForm1.Edit1Change(Sender: TObject);
  283. begin
  284.  
  285. end;
  286.  
  287. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement