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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2015, 22:42   #1
Abimeleh
Пользователь
 
Аватар для Abimeleh
 
Регистрация: 13.07.2012
Сообщений: 57
По умолчанию Переделать рекурсию в итерацию в QBasic

Доброго времени суток. Есть реализация алгоритма "быстрая сортировка" на QBasick рекурсией.
Код:
CLS
RANDOMIZE TIMER
 
INPUT "Vvedite razmer massiva: ", n
 
DIM SHARED y(n)
 
PRINT "Ishodnij massiv:"
FOR I = 1 TO n
 y(I) = INT(RND * 100) + 1
 PRINT y(I);
NEXT I
PRINT
 
QSORT 1, n
 
PRINT "Otsortirovannij massiv:"
FOR I = 1 TO n
 PRINT y(I);
NEXT I
 
SUB QSORT (LOW, HIGH)
   J = HIGH
   X = y((LOW + HIGH) / 2)
   DO
      WHILE y(I) < X: I = I + 1: WEND
      WHILE y(J) > X: J = J - 1: WEND
      IF I <= J THEN
         SWAP y(I), y(J)
         I = I + 1
         J = J - 1
      END IF
   LOOP WHILE I <= J
   IF LOW < J THEN QSORT LOW, J
   IF I < HIGH THEN QSORT I, HIGH
END SUB
Никак не врублюсь как это можно корректно переделать итерацией.

Вот одна из моих неудачных проб:
Код:
OPTION BASE 1
RANDOMIZE TIMER
DIM n AS INTEGER
DIM i, j AS INTEGER
DIM x, p AS INTEGER
DIM si, fi, sj, fj AS INTEGER
CLS
x = 2      'delitel
n = 7   'dlina massiva
j = n
i = 1

DIM arr(n) AS INTEGER

FOR k% = 1 TO n
 arr(k%) = INT(RND * 9) + 1
 PRINT arr(k%);
NEXT k%
PRINT

'poisk srednego indeksa
avr% = (n / x) + 1
memo% = avr%
'opornij element
p = arr(avr%)
si = 1  'l means start for i
fi = n  'h means finish fo i

sj = 1   'start for j
fj = n   'finish for j
'-------------------------------------------------
PRINT
start:
DO
FOR i = si TO fi
   IF arr(i) >= p THEN si = si + 1: EXIT FOR
NEXT i

FOR j = fj TO sj STEP -1
'  PRINT arr(j);
  IF arr(j) <= p THEN fj = fj - 1: EXIT FOR
NEXT j

IF i <= j THEN SWAP arr(i), arr(j)

LOOP WHILE i <= j
'-------------------
'2 etap
IF flg% = 0 THEN
 si = 1: fi = avr% 'indeks v kotorom nahoditsa opornij element !!!
 sj = 1: fj = avr%

 avr% = avr% / 2
 IF avr% = 1 THEN avr% = memo% + 1: flg% = 1
END IF

IF flg% = 1 THEN
 avr% = avr% + c%: c% = c% + 1: IF avr% > n THEN GOTO 15
END IF

p = arr(avr%)
GOTO start
15
FOR k% = 1 TO n
 PRINT arr(k%);
NEXT k%
Дает неверные результаты. Буду весьма признателен если кто поможет понять как это можно сделать...
How ugly are feet of those who bring bad news. (comp Romans 10:15)
Abimeleh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решил на Mathcad.Написать итерацию на Pascal. piko Помощь студентам 0 12.02.2013 14:25
Задача решена.Написать итерацию.Запутался piko Помощь студентам 0 10.02.2013 14:03
маленькая задача на простую итерацию Генна Помощь студентам 0 02.04.2012 18:45
Перевод из рекурсии на итерацию Anubys Помощь студентам 0 18.04.2011 18:12
Задача на рекурсию. KoHgpaT Паскаль, Turbo Pascal, PascalABC.NET 4 22.12.2006 20:49