Реализация пирамидальной сортировки
Доброго времени суток.
Javascript изучаю сравнительно недавно, поэтому не шарю, может кто подсказать: - почему нижеследующий код виснет как только доходит до *Основного блока программы* - мб кто поможет реализовать отрисовку пирамид на каждом 2-3 шаге сортировки? Да и по всей видимости проблемы с выводом. /*------Задаем длину массива------*/ var arrayLength = prompt('Введите длину массива', 10); var arr = []; //alert(arr.length); /*------*****************------*/ /*------Заполняем массив------*/ for (var i=0; i<arrayLength; i++) { var newElemArray = prompt('Введите '+(i+1)+' число массива', 0); arr.push(newElemArray); } alert(arr); /*------****************------*/ /*------Функция сортировки------*/ function swap (n1, n2) { var temp, num1, num2; temp = num1; num1 = num2; num2 = temp; } /*------****************------*/ /*------Основное тело программы------*/ var shift = 0; var b = false; for (;;) { b = false; for (var i=0; i<arrayLength; i++) { if (i*2+2+shift<arrayLength) { if ((arr[i + shift] > arr[i*2+1+shift]) || (arr[i+shift] > arr[i*2+2+shift])) { if (arr[i*2+1+shift] < arr[i*2+2+shift]) { swap(arr[i*2+1+shift],arr[i*2+2+shift]); b = true; } else if (arr[i*2+2+shift] < arr[i+2+1+shift]) { } } } } if( arr[i*2 + 2 + shift] < arr[i*2 + 1 + shift] ) { swap( arr[i*2+1+shift], arr[i * 2 +2+ shift] ); b = true; } else if( i * 2 + 1 + shift < arrayLength ) { if( arr[i + shift] > arr[ i * 2 + 1 + shift] ) { swap( arr[i + shift], arr[i * 2 + 1 + shift] ); b = true; } } } if (!b) shift++; //смещение увеличивается, когда на текущем этапе сортировать больше нечего if (shift+2==arrayLength) return 0; alert('Конец осртировки'); alert(arr); Почему JS? потому что интересно).. на с++ альтернативный код пашет. Как реализовать нечто подобное на JS ума не приложу. Заранее спасибо!. |
icqprophet,
Лениво вникать в код - объясните задачу на пальцах ? |
Ну если на пальцах, то сама задача заключается в :
1. Запросить от пользователя массив (длину/числа) 2. Отсортировать массив методом "Пирамидальной сортировки" (еще называют "Турнирная сортировка"). Довольно подробное описание алгоритма есть тут. Каждый шаг сортировки отрисовать в виде пирамиды. Как я уже писал выше, альтернативный код на с++ работает, но с JS возникли недопонимания :).. ---- Код с первого поста проверял отладчиком хрома, ошибок нету, но начиная с 25 строки код либо не выполняется впринципе, либо тупо виснет. Так как опыта мало, я так и не понял в чем проблема. |
Можно свести к алгоритму для питона,
def heapsort(s): sl = len(s) def swap(pi, ci): if s[pi] < s[ci]: s[pi], s[ci] = s[ci], s[pi] def sift(pi, unsorted): i_gt = lambda a, b: a if s[a] > s[b] else b while pi*2+2 < unsorted: gtci = i_gt(pi*2+1, pi*2+2) swap(pi, gtci) pi = gtci # heapify for i in range((sl/2)-1, -1, -1): sift(i, sl) # sort for i in range(sl-1, 0, -1): swap(i, 0) sift(0, i) Но лень - просмотрите все методы массивос и объектов http://javascript.ru/basic/array |
Цитата:
Цитата:
#include <algorithm> #include <vector> template <typename ...T> void heapsort (T... range) { std::make_heap(range...); std::sort_heap(range...); } ; std::vector<int> vector = {1, 4, 3, 0, 2}; heapsort(vector.begin(), vector.end()); // 0, 1, 2, 3, 4 PS: C++11 |
Цитата:
В любом случае спасибо! |
Цитата:
------------------------- Как обычно весь скрипт загинался от подобной мелочи как скобка и пары других недочетов. Скрипт заработал, не правильно, но заработал, уже результат. Буду разбираться уже в алгоритме. Всем спасибо за помощь! Кстати чуть не забыл, как можно реализовать отрисовку пирамиды?.. интересна сама идея. |
:write: как-то так ...
var arr = [4,7,6,5,8,2,0,3,1,12,4,7,6,5,8,2,0,3,12,4,7,6,5,8,2,0,3,1,12,4,7,6,5,8,2,3]; function sort(b) { function d(a, c) { var d = b[a]; b[a] = b[c]; b[c] = d } for (var c = b.length; c--;) { for (;;) { for (var e = !0, a = 0; a < (c - 1) / 2; a++) b[a] < b[2 * a + 1] && (d(a, 2 * a + 1), e = !1), b[a] < b[2 * a + 2] && (d(a, 2 * a + 2), e = !1); if (e) break } b[0] > b[c] && d(0, c) } return b }; alert(arr + "\n" +sort(arr)+"\n"+arr) |
Цитата:
|
Цитата:
Кто подскажет как пошагово отрисовать пирамиды?.. |
Часовой пояс GMT +3, время: 03:22. |