Программирование на языке Pascal - ФОРУМ

Объявление

Продолжается конкурс на "Самый прикоьный юзербар" Голосовать и просматривать голоса других вы можете в форуме События, раздел "Голосование"

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Сортировки

Сообщений 1 страница 10 из 10

1

Про сортировки!

0

2

Сортировка вставками O(n^2)

Будем просматривать элементы массива A, начиная со второго. Каждый новый элемент А[i] будем вставлять на подходящее место в уже упорядоченную совокупность A[1], ..., A[i-1]. Это место определяется последовательными сравнениями элемента A[i] с упорядоченными элементами A[1], …, A[i-1].

Алгоритм на Pascal:

Код:
For j:=2 to n do
Begin
   Key:=a[j];
   {Вставка элемента A[j] в отсортированную последовательность A[1..j-1]}
   I:=j-1;
   While (i>0) and (A[i]>key) do
       Begin
           A[i+1]:=a[i];
           Dec(i);
       End;
   A[i+1]:=key;
End;

0

3

baitur написал(а):

Ну вот и дошли до быстрой сортировки... Может, кому и полезно будет

Код:
{  реурсивные алгоритмы: быстрая сортировка, см. программу внизу           }
{  ----------------------------------------------------------------------- }
{                           БЫСТРАЯ СОРТИРОВКА.                            }
{       Устанавливаем I=1 и J=N. Сравниваем элементы  A[i]  и  A[J].  Если }
{  A[i]<=A[J], то уменьшаем J на 1 и проводим  следующее сравнение элемен- }
{  тов A[i] с A[J]. Последовательное уменьшение индекса J и сравнение ука- }
{  занных элементов  A[i] с A[J] продолжаем  до тех пор,  пока выполняется }
{  условие A[i] <= A[J]. Как только A[i] станет больше A[J], меняем места- }
{  ми элементы A[i] с A[J], увеличиваем индекс I на 1 и продолжаем сравне- }
{  ние  элементов  A[i] с A[J]. Последовательное увеличение  индекса  I  и }
{  сравнение (элементов A[i] с A[J]) продолжаем до тех  пор, пока выполня- }
{  ется условие A[i] <= A[J].  Как  только A[i] станет больше A[J],  опять }
{  меняем местами элементы A[i] с A[J], снова начинаем уменьшать J.        }
{       Чередуя уменьшение J и увеличение I, сравнение и необходимые обме- }
{  ны, приходим к некоторому элементу, называемому  пороговым или главным, }
{  характеризующим условие  I=J. В результате элементы массива оказываются }
{  разделенными на две части так, что все элементы слева - меньше главного }
{  элемента, а все элементы справа - больше главного элемента.             }
{       К этим  массивам применяем рассмотренный алгоритм, получаем четыре }
{  части и т.д. Процесс закончим, когда массив A станет полностью отсорти- }
{  рованным.                                                               }
{       При программировании алгоритма "Быстрой сортировки" удобно исполь- }
{  зовать рекурентные вызовы процедуры сортировки (рекурсию).              }
{  ----------------------------------------------------------------------- }

var a:array[1..10] of integer; { массив элементов }
    n:integer;

procedure QuickSort( L, R : Integer ); { Быстрая сортировка массива A[] }
var i,j,x,y : integer;
begin
  i := l; j := r;
  x := a[(l+r) div 2];
  repeat
    while (A[i]<x) do inc(i);
    while (x<A[j]) do dec(j);
    if ( i<=j ) then
    begin
      y:=A[i]; a[i]:=a[j]; a[j]:=y;
      inc(i); dec(j);
    end;
  until (i>j);
  if (l<j) then QuickSort(l,j);
  if (i<r) then QuickSort(i,r);
end;

begin
     writeln('введите 10 элементов массива:');
     for n:=1 to 10 do readln(a[n]);
     QuickSort( 1, 10 ); { на входе: левая и правая граница сортировки }
     writeln('после сортировки:');
     for n:=1 to 10 do writeln(a[n]);
end.

0

4

Ну а эт, сортировка  слиянием))

Код:
function mergesort(s : TUzelUk; e : TUzelUk):TUzelUk;
Var
   n,i,j    : integer;
   t1,t2,tp : TUzelUk;
   l,r	    : TuzelUk;
   res,rese : TUzelUk;

begin
   t1:=s;
   n:=0;
   res:=nil;

   while(t1<>nil) do begin
      if(t1=e) then
          break;
      inc(n);
      t1:=t1^.n;
   end;

   {trivialni pripad}
   if(n = 1) then begin
      add(res,rese,s^.v);
      mergesort:=res;
      exit;
   end;

   {rozdelovaci faze}
   t1:=s;
   i:=1;
   while((t1<>nil)and(i<=(n div 2))) do begin
      inc(i);
      t1:=t1^.n;
   end;

   {rekurcia}
   l:=mergesort(s,t1);
   r:=mergesort(t1,e);

   {slejvani}
   t1:=l;
   t2:=r;
   while((t1<>nil)and(t2<>nil)) do begin
      if(t1^.v<=t2^.v) then begin
	 add(res,rese,t1^.v);
	 t1:=t1^.n;
      end else begin
	 add(res,rese,t2^.v);
	 t2:=t2^.n;
      end;
   end;

  
   while(t1<>nil) do begin
      add(res,rese,t1^.v);
      t1:=t1^.n;
   end;
   while(t2<>nil) do begin
      add(res,rese,t2^.v);
      t2:=t2^.n;
   end;

   
   t1:=l;
   while(t1<>nil) do begin
      tp:=t1;
      t1:=t1^.n;
      dispose(tp);
   end;

   t1:=r;
   while(t1<>nil) do begin
      tp:=t1;
      t1:=t1^.n;
      dispose(tp);
   end;

   mergesort:=res;
end;

0

5

Правда этим мало кто пользуется....

Код:
program DemonstrateHeapsort;
{$B-}
uses windos;
const MaxSize = 16000;

type  dataType = integer;
      heapType = array[1..MaxSize] of dataType;

procedure Adjust(var H : heapType; Root, Last : integer);
{ --------------------------------------------------------
  Converts a semiheap into a heap.
  Precondition: H is a semiheap rooted at position Root;
  Last marks the end of the semiheap. $B- is in effect.
  Postcondition: H is a heap rooted at position Root;
  Last marks the end of the heap.
  Method: Recursively trickles the item at position Root
  down to its proper position by swapping it with its larger
  child, if the child is larger than the item. If (2 * Root)
  > Last, the item is at a leaf and nothing needs to be done.
  -------------------------------------------------------- }
var	Child, RightChild : integer;
	Temp  : dataType;
begin
	if (2 * Root) <= Last
then	{ root is not a leaf }
begin
{ find index of larger child of root }
	Child := 2 * Root;         { index of root's left child }
	RightChild := succ(Child); { right child, if any}

	{ if there is a right child, find larger child }
	if (RightChild <= Last) and	(H[RightChild] > H[Child])
then Child := RightChild;
	{ Child is the index of larger child of root }

{ if the value at position Root is smaller than
  the value in the larger child, swap values }
	if H[Root] < H[Child]
then
begin
	{ swap }
	Temp := H[Root];
	H[Root] := H[Child];
	H[Child] := Temp;

	{ adjust the new subtree }
	Adjust(H, Child, Last)
end  { if }
end  { if }
{ if root is a leaf, do nothing }
end;  { Adjust }

procedure BuildHeap(var H : heapType; N : integer);
{ --------------------------------------------------------
  Builds the initial heap.
  Precondition: H is an array of N items.
  Postcondition: H is a heap of N items.
  -------------------------------------------------------- }
var Index : integer;
begin
	for Index := N downto 1 do
{ tree rooted at Index is a semiheap -
  transform it into a heap }
Adjust(H, Index, N)
end;  { BuildHeap }

procedure Heapsort(var A: heapType; N : integer);
{ --------------------------------------------------------
  Sorts an array by using heapsort.
  Precondition: A is an array of N items.
  Postcondition: A is sorted into ascending order.
  -------------------------------------------------------- }
var	Last : integer;
	Temp : dataType;
begin
	BuildHeap(A, N);{ build the initial heap }

	for Last := N downto 2 do	{ heapsort }
	{ loop invariant: A[1..Last] is a heap, A[Last+1..N] is
	  sorted and contains the largest elements of A }
	begin
{ swap A[1] and A[Last] }
Temp := A[1];
A[1] := A[Last];
A[Last] := Temp;

{ change semiheap into a heap }
Adjust(A, 1, pred(Last))
	end  { for }
end;  { Heapsort }

{ ******SAMPLE MAIN PROGRAM****** }
const Initialize = 870;

var  A : HeapType;
     N, Size : integer;
     Hour : word;
     Minute, Second : word;
     Sec100 : word;
     HeapSortOut: text;


begin
   { create an array of random integers }
  { Randomize;    }
   assign (HeapSortOut, 'a:HeapOut');
   rewrite (HeapSortOut);
   Randseed :=  Initialize;
   Size := MaxSize;
   for N := 1 to Size do
      A[N] := random(2000);
   writeln;
   writeln(HeapSortOut);
   writeln('This is a Heap Sort with an array size of', MaxSize:8, ' elements');
   writeln(HeapSortOut,'This is a Heap Sort with an array size of', MaxSize:8, ' elements');
   writeln('The array before sorting is: ');
   writeln(HeapSortOut, 'The array before sorting is: ');
   for N := 1 to 10 do
     begin
        write(A[N]:6);
        write(HeapSortOut, A[N]:6);
     end;
   writeln;
   writeln (HeapSortOut);
   gettime (Hour, Minute, Second, Sec100);
   writeln ('Start Time: ',Hour, 'Hour ':6, Minute, 'Minute ':8, Second,'Second ':9,
            Sec100,' Hundredths of seconds ':14);
   writeln (HeapSortOut,'Start Time: ',Hour, 'Hour ':6, Minute, 'Minute ':8, Second,'Second ':9,
            Sec100,' Hundredths of seconds ':14);

   { sort the array }
   HeapSort(A, Size);
   gettime (Hour, Minute, Second, Sec100);
   writeln ('End   Time: ',Hour, 'Hour ':6, Minute, 'Minute ':8, Second,'Second ':9,
            Sec100,' Hundredths of seconds ':14);
   writeln (HeapSortOut,'End   Time: ',Hour, 'Hour ':6, Minute, 'Minute ':8, Second,'Second ':9,
            Sec100,' Hundredths of seconds ':14);
   writeln('The array after sorting is: ');
   writeln(HeapSortOut,'The array after sorting is: ');
   for N := 1 to 15 do
     begin
        write(A[N]:4);
        write(HeapSortOut, A[N]:4);
     end;

   close (HeapSortOut);
end.

0

6

Еще один тип сортировки - это сортировка "Черпак". Она очень быста для небольших значений и небольших количеств элементов. Я ее лично усовершенствовал, чтобы терялось времени на исполнение алгоритма меньше.

Код:
var a,b            :array[1..10000]of integer;
      i,j,n,max   :longint;
begin
   fillchar(b,sizeof(b);0);
   readln(n);

      for i:=1 to n do
          read(a[i]);

      for i:=1 to n do
          if a[i]>max
             then max:=a[i];


      for i:=1 to n do
          inc(b[a[i]]);

      for i:=0 to max do
          write(i,' ');

end.

0

7

когда то писал это, походу немного глючит, корочь, эффективно при сортировки строк.

Код:
   program tree;
    uses crt;
     type pwl=^din; st=string[20];
          din= record
                  inf:st;
                  left,right,top:pwl;
               end;
      var root,ed,rab,tek,pred:pwl;
          f:text;
          i,n:integer;
          b,ex:boolean;
          a:st;
//--------MR----------------------------------
 Function mr(one,two:st):boolean;
  var i,n:integer;
      ex:boolean;
  begin
   if length(one)<length(two) then n:=length(one) else n:=length(two); i:=1; ex:=true;
   while ex do
     if  one[i]<two[i] then
      begin
       mr:=true;
       ex:=false; inc(i);
      end
       else if one[i]>two[i] then
        begin
         mr:=false;
         ex:=false; inc(i);
        end else begin ex:=true;  inc(i); end;

  end;
//-------mr end-----------------------------------
BEGIN clrscr;
   assign(f,'inp.txt');
   reset(f);
   readln(f,n);
// ====Root==================================
    new(root);
    new(ed);
   with ed^ do
     begin
      left:=nil;
      right:=nil;
      top:=nil
     end;

     With root^ do
        begin
         readln(f,inf);
         top:=ed;
         left:=nil;
         right:=nil;
        end;
//===Root==================================

//============================================

//==============Writing in tree begin=======================================
 {for i:=1 to n-1 do}
  while not eof(F) do 
  BEGIN
    tek:=root;
    ex:=true;
     while ex do
       begin
         readln(f,a);
         if mr(a,tek^.inf) and (tek^.left=nil)
          then
           begin
            new(rab);
             with rab^ do
              begin
               readln(f,inf);
               left:=nil;
               right:=nil;
               top:=tek;
              end;
              tek^.left:=rab;
              ex:=false;
            end
           else if mr(a,tek^.inf)=false  and (tek^.right=nil)
            then
             begin
              new(rab);
               with rab^ do
                begin
                 readln(f,a);
                 left:=nil;
                 right:=nil;
                 top:=tek;
                end;
              tek^.right:=rab;
              ex:=false;
             end
            else if mr(a,tek^.inf)
             then tek:=tek^.left
             else tek:=tek^.right;
       end;
  END;
//=======================Writing in tree end====================================

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//=======================Reading in tree begin=================================
 tek:=root;
 i:=0;



 while tek^.left<>nil do
   tek:=tek^.left;
 while tek^.top<>nil do
  BEGIN
   if tek^.right<>nil
    then
     tek:=tek^.right
    else
     if tek^.left<>nil
      then
       tek:=tek^.left
      else
       begin
        writeln(tek^.inf);
        rab:=tek;
        tek:=tek^.top;
        dispose(rab);
         with tek^ do
          begin
           left:=nil;
           right:=nil;
          end;
       end;
    END;
//==================Reading tree end=====================================



readln;


END.

0

8

сё больше незнаю...

0

9

+1 baitur

Продолжай в том же духе всегда и во в!!сем

0

10

ОК!

0



Рейтинг форумов | Создать форум бесплатно