Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Есть вопрос по функции mergesort.  (Прочитано 12148 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Just
Гость
« : 19-09-2008 13:10 » 

Есть вот такое задание:

на странице по ссылке
http://algolist.manual.ru/sort/merge_sort.php
расписан алгоритм сортировки слиянием
Ваше задача:
Создать Массив на 1000 элементов заполнит его случайными значениями от 1-1000
и используя описанный алгоритм отсортировать его в порядке возрастания.
Я сделал такой код:
Код:
function mergesort($array, $beg, $end) {
    if (count($array) < 1) return;
    else
    {
    $split = count($array) / 2;

    $array1 = array_slice($array, $beg, $split);

    $array2 = array_slice($array, $split + 1, $end);
    sort($array1);
    sort($array2);
    }
    $array = array();
    $ptr1 = $ptr2 = 0;
    while ($ptr1 <= count($array1) && $ptr2 <= count($array2)) {
        if ($array1[$ptr1] < $array2[$ptr2]) {

           $array[] = $array1[$ptr1++];
        }
        else {
            $array[] = $array2[$ptr2++];
        }
    }


while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
return $array;
    }



$beg = 1;
$end = 1000;
$ar = array();
/* заполнение массива случайными числами, вариант первый: */
for($i = 1; $i <= 1000; $i++)
{
$ar[] = $i;
shuffle($ar);
}
/*вариант второй:
$ar = array();
for($i = 1; $i <= 1000; $i++)
{
$ar[$i] = rand(1, 1000);
}
*/
echo "Sorted massiv:";
echo '<br><br>';
$sorted = mergesort($ar, $beg, $end);
foreach($sorted as $val)
{
 echo $val; echo '<br><br>';
}
мне пришел ответ:
Переработайте скрипт без использования стандартных функций sort, array_slice, используя созданую Вами функцию
mergesort (используя рекурсию) Обратите внимание на использование минимального количества памяти сделать замер.

Я не знаю как это сделать помогите кто чем сможет. Заранее спасибо!


Записан
Just
Гость
« Ответ #1 : 19-09-2008 13:33 » 

Я попробовал переделать функцию mergesort, таким образом:

Код:
function mergesort(&$array, $beg, $end) {
    if (count($array) < 2) return;
    else
    {
    $split = count($array) / 2;

    $array1 = array_slice($array, $beg, $split);

    $array2 = array_slice($array, $split + 1, $end);

    mergesort($array1, $beg, $split);
    return $array1;
    mergesort($array2, $split+1, $end);
    return $array2;
    }
    $array = array();
    $ptr1 = $ptr2 = 0;
    while ($ptr1 <= count($array1) && $ptr2 <= count($array2)) {
        if ($array1[$ptr1] < $array2[$ptr2]) {

           $array[] = $array1[$ptr1++];
        }
        else {
            $array[] = $array2[$ptr2++];
        }
    }


while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
return $array;
    }
возвращается не отсортированный массив. Каким образом вызвать ее рекурсивно и передать правильные параметры не могу понять.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 19-09-2008 13:45 » 

что это?

mergesort($array1, $beg, $split);
return $array1;

mergesort($array2, $split+1, $end);
return $array2;
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Just
Гость
« Ответ #3 : 19-09-2008 13:56 » 

mergesort($array1, $beg, $split); - вызов самой себя рекурсивно, с передачей параметров для сортировки(сам сортируемый массив, его левая граница и правая).
return $array1; - возврат отсортированного массива, обратно в вызывающую функцию.
Во втором случае тоже самое.

скорее всего это неправильно, я просто сам не знаю как вызвать эту ф-цию рекурсивно.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 19-09-2008 14:22 » 

Рекурсия.
Цитата
PROGNAME=$0
дальше по тексту
$PROGNAME
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 19-09-2008 14:58 » 

ну ты вызвал функцию
потом ретёрн
а потом второй раз вызываешь
а ретёрн уже прошел
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Just
Гость
« Ответ #6 : 19-09-2008 15:27 » 

я просто не знаю как сделать возврат из рекурсивной ф-ции. Поэтому и написал этот ретерн.
Если сделать вот так:
Код: (PHP)
function mergesort(&$array, $beg, $end)
{
        if (count($array) < 2)
                return;
        else
        {
                $split = count($array) / 2;

                $array1 = array_slice($array, $beg, $split);
                $array2 = array_slice($array, $split + 1, $end);

                mergesort($array1, $beg, $split);
                mergesort($array2, $split+1, $end);
        }

        $array = array();
        $ptr1 = $ptr2 = 0;

        while ($ptr1 <= count($array1) && $ptr2 <= count($array2))
        {
                if ($array1[$ptr1] < $array2[$ptr2])
                {
                        $array[] = $array1[$ptr1++];
                }
                else
                {
                        $array[] = $array2[$ptr2++];
                }
        }

        while ($ptr1 < count($array1))
                $array[] = $array1[$ptr1++];

        while ($ptr2 < count($array2))
                $array[] = $array2[$ptr2++];

        return $array;
}


возвращается пустой массив.

Переформатировал код в более читаемый вид.
« Последнее редактирование: 20-09-2008 16:10 от RXL » Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 19-09-2008 21:05 » 

Just, почитай вообще про рекурсию.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-09-2008 16:12 » 

Just, у нас есть хорошие статьи о рекурсии:

Тут: https://club.shelek.ru/view.php?id=25

https://club.shelek.ru/viewart.php?id=184
https://club.shelek.ru/viewart.php?id=205
https://club.shelek.ru/viewart.php?id=220
https://club.shelek.ru/viewart.php?id=226
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Just
Гость
« Ответ #9 : 21-09-2008 13:56 » new

Спасибо большое за помощь! Обязательно почитаю статьи.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines