Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Сортировка Turbo Pascal (http://www.tehnari.ru/f41/t92982/)

Cassan 09.12.2013 23:02

Сортировка Turbo Pascal
 
Помогите, пожалуйста чтобы программа заработала правильно.
Условие: Дан массив C(N). Преобразовать массив, упорядочив первую его половину элементов по возрастанию, а вторую по убыванию.(Известно, что N-четное).
Применялся улучшенный метод: быстрая сортировка Хоара, но уже замучались с этим, не запускается и ошибки. Главное чтобы правильно сортировала по условию.

Код:

Uses Crt;
Const                N = 50;
Type                T_Mas = Array [1..N] of Integer;
Var                Mas        : T_Mas;
                Kol        : Integer;

                               
Procedure Count (Var Kol:Integer);
{Процедура определения размерности массива}
Var                IOR        : Word;
Begin
Write('Введите размерность массива: ');
        Repeat
                {$I-} ReadLn(Kol); {$I+}
                IOR := IOResult;
                If odd(IOR) or (Kol>N) Then
                        WriteLn('Ошибка. Повторите ввод.')
        Until (Kol<=N) and (IOR=0)
End;


Procedure Filling (Kol:Integer; Var A: T_Mas);
{Процедура заполнения массива}
Var I : Integer;
Begin
        Randomize;
        For I := 1 To Kol Do A[I] := Random(N)
End;


Procedure Print (Kol:Integer; A: T_Mas);
{Процедура вывода массива}
Var I : Integer;
Begin
        For I:=1 to Kol do Write (A[I], ' ')
End;

procedure quicksort1(var a: T_Mas; Lo,Hi: integer);

  procedure sort1(kol,l,r: integer);
  var
    i,j,x,y,k: integer;
begin
k:= Kol div 2;
for i:=1 to k-1 do
  begin
    i:=l; j:=r; x := a[(r+l) div 2];
    repeat
      while a[i]<x do i:=i+1; { a[i] > x  - сортировка по убыванию}
      while x<a[j] do j:=j-1; { x > a[j]  - сортировка по убыванию}
      if i<=j then
      begin
        if a[i] > a[j] then {это условие можно убрать} {a[i] < a[j] при сортировке по убыванию}
        begin
          y:=a[i]; a[i]:=a[j]; a[j]:=y;
        end;
        i:=i+1; j:=j-1;
      end;
    until i>=j;
    if l<j then sort1(l,j);
    if i<r then sort1(i,r);
end;
  end; {sort}

  procedure sort2(kol,l, r : Integer);
  Var
    i, j, x, y, k: Integer;
begin
k:= Kol div 2;
for i:=1 to k-1 do
  Begin
    i:=l; j:=r; x := a[(r+l) div 2];
    repeat
      while a[i]>x do i:=i+1; { a[i] > x  - сортировка по убыванию}
      while x>a[j] do j:=j-1; { x > a[j]  - сортировка по убыванию}
      if i<=j then
      begin
        if a[i] < a[j] then {это условие можно убрать} {a[i] < a[j] при сортировке по убыванию}
        begin
          y:=a[i]; a[i]:=a[j]; a[j]:=y;
        end;
        i:=i+1; j:=j-1;
      end;
    until i>=j;
    if l<j then sort2(l,j);
    if i<r then sort2(i,r);
end;
  End;

begin {quicksort};
  sort1(Lo,Hi);
  Lo := 11;
  Hi := 20;
  Sort2(Lo, Hi)
end; {quicksort}

Begin
        ClrScr;
        Count(Kol);
        Filling(Kol, Mas);
        WriteLn('Исходный массив'); Print (Kol, Mas);
        quickSort1(Mas, 1, 10);
        WriteLn;
        WriteLn('Отсортированный массив'); Print (Kol, Mas);
        Repeat until KeyPressed
End.


Vladimir_S 10.12.2013 12:15

Цитата:

Сообщение от Cassan (Сообщение 978972)
Применялся улучшенный метод: быстрая сортировка Хоара

О, Боже - этого еще не хватало! И откуда среди преподов появляются подобные извращенцы? Ладно, будем разбираться. Быстро не обещаю.

Cassan 10.12.2013 20:23

да не говорите, уже всё перепробовали, но всё неправильно.
советовали сделать как-то без рекурсии, но ничего не понятноtehno015
Спасибо, что отозвались, буду ждать вашей помощи!

Cassan 10.12.2013 20:27

может вы как-то по своему сможете реализовать эту процедуру, по-проще:dog:.

Vladimir_S 10.12.2013 20:35

Цитата:

Сообщение от Cassan (Сообщение 979371)
может вы как-то по своему сможете реализовать эту процедуру, по-проще:dog:.

"Попроще" - это разве что без Хоара, но ведь Вам нужно именно Хоаром? Даже и не знаю, когда время найду, тут дело серьёзное.

Cassan 10.12.2013 20:50

да вот "счастье" такое, ну ладно как время будет
Ещё вопрос нам учитель просто задал сделать один базовый метод сортировки и один от него улучшенный, мы сделали базовую пузырьковая, а улучшенная получается быстрая сортировка, быстрая это и есть Хоара?(нам просто так объясняли)

Cassan 10.12.2013 22:30

А может выбрать пирамидальную она легче или нет, как вы посоветуете?

Cassan 14.12.2013 10:59

Цитата:

Сообщение от Vladimir_S (Сообщение 979377)
Даже и не знаю, когда время найду, тут дело серьёзное.

Спасибо, но уже помощь не требуется, разобрались. Теперь будем с пирамидальной разбираться.

Vladimir_S 14.12.2013 11:05

Цитата:

Сообщение от Cassan (Сообщение 980727)
Спасибо, но уже помощь не требуется, разобрались. Теперь будем с пирамидальной разбираться.

Ну вот, а я уж было решил на выходных поиграть с этой задачкой... :D Впрочем, конечно, всегда приятно, когда люди сами справляются, так что - мои поздравления!
P.S. Впрочем, не исключено, что всё-таки повожусь с этим Хоаром. Уже для себя. Как говорил почтальон Печкин, "в порядке повышения образованности".

Cassan 14.12.2013 11:25

а с пирамидальной сортировкой не хотите повозиться?:tehnari_ru_942:


Часовой пояс GMT +4, время: 02:54.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.