Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 11.11.2018, 18:21   #1
Max953121
 
Регистрация: 11.11.2018
Сообщений: 3
Репутация: 10
По умолчанию Быстрая сортировка. В чем ошибка?

Код:
Program Bistraia;
const n=600;
var i : integer;
var a:array[1..n] of integer;
procedure QSort(first, last: Integer ); 
var l, r, c, x: integer;
begin
  if first < last then begin
    a[i]:=a[(first + last) div 2]; //Ошибка времени выполнения: Индекс находился вне границ массива
    l:=first; r:=last;
    while l <= r do begin
      while a[l] < x do l:=l+1;
      while a[r] > x do r:=r-1;
      if l <= r then begin
        c:=a[l]; a[l]:=a[r]; a[r]:=c;
        l:=l+1; r:=r-1;
      end;
    end;
    QSort(first, r); QSort( l, last);
    end;    
end;
begin
randomize;
for i:=1 to n do begin
  a[i]:=random(5000+6500+1)-6500;
  write(a[i], ' ');
end;
writeln('Нажмите любую кнопку для продолжения');
readln();
for i:=1 to n do
 QSort(a[i],a[n]);
writeln('Нажмите любую кнопку для продолжения');
readln();
for i:=1 to n do
  write(a[i], ' '); 
end.
Пожалуйста, оформляйте Ваш код согласно правилам.

Последний раз редактировалось Вадим Мошев; 11.11.2018 в 19:01.
Max953121 вне форума   Ответить с цитированием
Старый 11.11.2018, 18:35   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,681
Репутация: 2631
По умолчанию

В том, что вы передаете сами элементы, а не индексы, как ожидает функция:
Код:
QSort(a[i],a[n]);
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 11.11.2018, 19:33   #3
Max953121
 
Регистрация: 11.11.2018
Сообщений: 3
Репутация: 10
По умолчанию

Исправил, теперь "Ошибка времени выполнения: StackOverflowException: Программа завершена из-за переполнения программного стека"
Max953121 вне форума   Ответить с цитированием
Старый 11.11.2018, 19:50   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,681
Репутация: 2631
По умолчанию

Ну что вы хотели... рекурсия это веселое дело. Увеличивайте стек или уменьшайте кол-во элементов.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 11.11.2018, 19:54   #5
Max953121
 
Регистрация: 11.11.2018
Сообщений: 3
Репутация: 10
По умолчанию

Хорошо, спасибо за помощь))
Max953121 вне форума   Ответить с цитированием
Старый 11.11.2018, 21:11   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 413
Репутация: 302
По умолчанию

Возможно, что переполнение стека из-за того, что перед завершением процедуры рекурсивный вызов должен быть по условию.
Код:
if first<r then
  QSort(first, r);
if last>l then
  QSort(l, last);
FPaul вне форума   Ответить с цитированием
Старый 11.11.2018, 21:19   #7
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 413
Репутация: 302
По умолчанию

Нет.
Вы вместо x инициализируете элемент массива
Код:
  if first < last then begin
    a[i]:=a[(first + last) div 2]; //Ошибка времени выполнения: Индекс находился вне границ массива
На этом месте должен был быть x.
FPaul вне форума   Ответить с цитированием
Старый 11.11.2018, 21:25   #8
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,469
Репутация: 1021
По умолчанию

Цитата:
Сообщение от Max953121 Посмотреть сообщение
Хорошо
Плохо. Ваша программа неработоспособна.

Похоже, Вы совсем не понимаете логику алгоритма.
Иначе трудно объяснить, почему Вы используете переменные, которым не присвоено значение. Откуда вдруг возникают i, x?

Посмотрите код на Розетте, может, станет более понятно
Black Fregat вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Быстрая сортировка. Где-то ошибка jeeeezy Помощь студентам 0 10.12.2011 00:57
не получается сортировка матрицы в чем ошибка? Darki Паскаль 5 23.06.2010 00:26
быстрая сортировка настолько быстрая Serg12 Помощь студентам 8 28.03.2010 21:31
[Pacsal] Быстрая Соритровка и сортировка обменом (ошибка) Dtska Помощь студентам 1 17.12.2009 21:17


07:02.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.