Реализация пирамидальной сортировки
Доброго времени суток.
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, время: 17:24. |