Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2015, 12:49   #1
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию Быстрая сортировка (QuicSort)

Подскажите пожалуйста, что не так? Вроде по подобию составлялась, но вычисляет не так. Эта сортировка показалась мне самой сложной.
Вот код:
Код:
program QuicSort;
type
   DataItem = real;
   DataArray = array [1..80] of DataItem;

var
   i, count: integer;
   v, mas: DataArray;

procedure qSort(l, r: longint);
var
   m, i, j: integer;
   w, q: real;
begin
   v := mas;
   i := l; 
   j := r;
   m:=(l + r) div 2;
   q := v[m];
   repeat
      while (v[i] < q) do inc(i);
      while (q < v[j]) do dec(j);
      if (i <= j) then    {это происходит, если i перешло за q? }
      begin
         w := v[i];
         v[i] := v[j];
         v[j] := w;
         inc(i);
         dec(j);
      end;
   until (i > j); {когда происходит, что i не больше j?}
   if (l < j) then qSort(l, j); {j- это вроде должен быть самый max из левой части, тогда l всегда будет меньше}
   if (i < r) then qSort(i, r);
   
end;

begin
   writeln('введите количество символов');
   readln(count);
   i := 0;
   for i := 1 to count do 
   begin
      write(i, 'i=');
      readln(mas[i]);
   end;   
   qSort(1, count);
   writeln('результирующий массив');
   for i := 1 to count do 
      write(v[i], ', ');
   { конец быстрой сортировки Хоара }   
end.
(Поясните ещё пожалуйста, если знаете те вопросы, которые в скобочках в коде. Литературы прочитано много и выполнение алгоритма по шагам понятно, но как это в программе выполняется не совсем ясно)
Asya7 вне форума Ответить с цитированием
Старый 07.09.2015, 12:55   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Не, чё вы сегодня сговоились? Блин, я уже устал носом тыкать. И мне есть предел. Модеры, да закрепите вы уже эту тему про сортировку. Достала молодёжка.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.09.2015, 13:02   #3
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Smitt&Wesson, уже всё прочитано! Но непонятности остались. Если вам сложно объяснять, то не нужно.
Asya7 вне форума Ответить с цитированием
Старый 07.09.2015, 13:08   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Asya7 Посмотреть сообщение
Smitt&Wesson, уже всё прочитано! Но непонятности остались. Если вам сложно объяснять, то не нужно.
Непонятности в чём? В коде или в понимании алгоритма? Как здесь все знают, я не лезу в Паскаль и Делфи, но по алгоритмам могу подсказать. А по С++, могу и с кодом помочь.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.09.2015, 13:13   #5
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Конечно в алгоритме. (что не понятно в скобочках написано) В общем, не совсем понятно как они меняются местами (i, j) если мы нашли большой слева, то вдруг мы не найдём меньший справа .. И с чем тогда менять его??
Asya7 вне форума Ответить с цитированием
Старый 07.09.2015, 13:18   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Asya7 Посмотреть сообщение
В общем, не совсем понятно как они меняются местами (i, j)
Переменый шаг.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.09.2015, 13:27   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Asya7 Посмотреть сообщение
Smitt&Wesson, уже всё прочитано! Но непонятности остались. Если вам сложно объяснять, то не нужно.
Вы сами компиль писали? Ну, тады - ой.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 07.09.2015 в 13:30.
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.09.2015, 13:32   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

сначала алгоритм/логика, а потом код
я чуть пофилософствую и по-понтуюсь
вам, здоровым, ничего не стоит написать код, стереть, опять написать и так хоть 1000 раз, а вот подумать - это уже сложнее..... ты пишешь быстрее, чем думаешь (с) в этом-то и беда!
моя же история совсем обратная: каждая буква мне даётся с трудом, поэтому я успеваю 100 раз подумать, прежде чем что-то написать
я весьма жесток и категоричен, поэтому, будь это возможно и эффективно, просто бы переломал 9 пальцев, чтоб ты, как я, начал печатать медленнее, чем думаешь, но, увы, гуманизм-дебилизм я не знаю как, но сделай так, чтоб тебе было легче подумать, чем написать! например, печатай одним мизинцем, после каждой строки кода делай по 10 бурпи и т. д.
если считаешь что я шучу, то я могу в ЛС (не хочу светить на форуме) скинуть одно видео, которое ясно покажет что я серьёзно.
GreenWizard вне форума Ответить с цитированием
Старый 07.09.2015, 14:20   #9
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

В общем, те моменты так и остались не понятны(в скобочках) , но заменив v на mas всё отлично заработало. Объясните пожалуйста, кто-нибудь хотя бы, почему так произошло??
Код:
program QuicSort;

type
   DataItem = integer;
   DataArray = array [1..80] of DataItem;

var
   i, count: integer;
   mas: DataArray;

procedure qSort(l, r: longint);
var
   w, q, m, i, j: integer;

begin
   i := l; 
   j := r;
   m := round((l + r) / 2);
   q := mas[m];
   repeat
      while (mas[i] < q) do inc(i);
      while (q < mas[j]) do dec(j);
      if (i <= j) then 
      begin
         w := mas[i];
         mas[i] := mas[j];
         mas[j] := w;
         inc(i);
         dec(j);
      end;
   until (i > j);
   if (l < j) then qSort(l, j); 
   if (i < r) then qSort(i, r); 
end;

begin
   writeln('введите количество символов');
   readln(count);
   for i := 1 to count do 
   begin
      write(i, 'i=');
      readln(mas[i]);
   end;   
   qSort(1, count);
   writeln('результирующий массив');
   for i := 1 to count do 
      write(mas[i], ', ');
   { конец быстрой сортировки Хоара }   
end.
Asya7 вне форума Ответить с цитированием
Старый 07.09.2015, 14:45   #10
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Asya7 Посмотреть сообщение
В общем, те моменты так и остались не понятны(в скобочках) , но заменив v на mas всё отлично заработало. Объясните пожалуйста, кто-нибудь хотя бы, почему так произошло??
потому что сортировался массив v, который каждый раз перезаписывался исходным массивом mas (v := mas; )
опять же, имена давай осмысленные, проводи трассировку (ещё лучше, если будешь на листике всё считать, чтоб лучше понять), не спеши писать код, изучи сначала сам алгоритм, посмотри визуализацию на том же ютубе.
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
быстрая сортировка!!!!!!!!!!!!!!!!!!!!!! narco3 Паскаль, Turbo Pascal, PascalABC.NET 2 25.02.2012 16:08
Быстрая сортировка(сортировка хаора) с++ LustHunter Помощь студентам 3 07.10.2011 19:37
быстрая сортировка настолько быстрая Serg12 Помощь студентам 8 28.03.2010 21:31
Быстрая сортировка _Studentka_ Помощь студентам 9 20.11.2009 00:19