Не выполняется условие в IF
Доброе утро, камрады...
Я озадачен. Возможно здорово туплю, но глаз уже замылился и ничего не понимаю. Банальная пузырьковая сортировка. Проще некуда. Сортирую массив по одной из колонок. Сортируется где-то наполовину, потом перестает. Смотрю в Firebug пошагово и не верю глазам С=14, arr[i+1][2]=16 и условие не выполняется (блок пропускается). При этом несколько проходов уже было успешно сделано на том же массиве данных. if ( С < arr[i+1][2] ) { arr[i][0] = arr[i+1][0]; arr[i][1] = arr[i+1][1]; arr[i][2] = arr[i+1][2]; arr[i+1][0] = A; arr[i+1][1] = B; arr[i+1][2] = C; change_flag = 1; } Помогите плиз лыжи стронуть с места... не едут... |
Цитата:
Конечно IF сломался - фигли! :lol: Тут у других не только IFы ломались... В JS вообще мало чего работает... :lol: |
Цитата:
По существу-то есть что-нибудь сказать? IFы, кстати, "ломаются" не так и редко в JS, по сравнению с Си, например. Вот, например. Но мне приведение значений parseInt-ом не помогло. "use strict" тоже не помог (хотел избавиться от возможных глюков с восьмеричным представлением числа в массиве данных). Кто-нибудь сталкивался с таким случаем? Куда копать? (гуглёж пока ничего особенного не принёс) |
Цитата:
|
Цитата:
Как теперь писать - х/з... |
Цитата:
|
Цитата:
(на самом деле их тысячи) var source = [ [743,434], [743,968], [310,968], [262,434], [695,677], [695,274], [145,274], [695,174], [743,871], [145,532], [922,677], [485,677], [821,729], [743,336], [111,274], [588,729], [743,274], [695,968], [695,677], [821,174], [111,871], [821,871], [145,968], [922,968], [588,729], [111,532] ] Нужно подсчитать, какие пары встречаются часто, какие реже - частотность, короче. Ну я и считаю эту частотность (что получается), а потом пытаюсь ее сортировать (что не получается) На самом деле в массиве могут быть некачественные данные, поэтому я привожу их в int function freqPairs( source ) { var pairs_matched = new Array(); var pairsmatched_n=0; var pairs = new Array(); var pairs_n=0; var tmp_pairs_freq = [-1,-1,-1]; var tmp_pair = [-1,-1]; // насильно конвертим source в десятичный инт for (var b=0; b < source.length; b++) { tmp_pair[0] = parseInt(source[b][0],10); tmp_pair[1] = parseInt(source[b][1],10); pairs_n = pairs.push( tmp_pair ); tmp_pair = [-1,-1]; } // подсчитываем частотность пар var cnt2=0; var pair_flag=1; tmp_pairs_freq[0] = pairs[0][0]; tmp_pairs_freq[1] = pairs[0][1]; tmp_pairs_freq[2] = parseInt(1,10); pairsmatched_n = pairs_matched.push( tmp_pairs_freq ); for (G=1; G < pairs.length; G++) { tmp_pairs_freq = [-1,-1,-1]; pair_flag=1; for (F=0; F < pairs_matched.length; F++) { if ( pairs[G][0] === pairs_matched[F][0] ) { if ( pairs[G][1] === pairs_matched[F][1] ) { pair_flag=0; cnt2=pairs_matched[F][2]; cnt2++; pairs_matched[F][2]=cnt2; } } } if ( pair_flag ) { tmp_pairs_freq[0] = pairs[G][0]; tmp_pairs_freq[1] = pairs[G][1]; tmp_pairs_freq[2] = parseInt(1,10); pairsmatched_n = pairs_matched.push( tmp_pairs_freq ); } } // сортируем пары по частотности var A = 0; var B = 0; var С = 0; var change_flag = 1; while ( change_flag > 0 ) { A = pairs_matched[0][0]; B = pairs_matched[0][1]; С = pairs_matched[0][2]; change_flag = 0; for (var S=0; S < pairs_matched.length-1; S++) { A = pairs_matched[S][0]; B = pairs_matched[S][1]; C = pairs_matched[S][2]; //вот тут периодически не срабатывает if ( С < pairs_matched[S+1][2] ) { pairs_matched[S][0] = pairs_matched[S+1][0]; pairs_matched[S][1] = pairs_matched[S+1][1]; pairs_matched[S][2] = pairs_matched[S+1][2]; pairs_matched[S+1][0] = A; pairs_matched[S+1][1] = B; pairs_matched[S+1][2] = C; change_flag = 1; } } } } |
Papazol,
:write: var source = [ [743,434], [743,968], [310,968], [262,434], [695,677], [695,274], [145,274], [695,174], [743,871], [145,532], [922,677], [485,677], [821,729], [743,336], [111,274], [588,729], [743,274], [695,968], [695,677], [821,174], [111,871], [821,871], [145,968], [922,968], [588,729], [111,532] ] function freqPairs(b) { for (var c = {}, a = 0; a < b.length; a++) { var d = b[a]; c[d] ? c[d]++ : c[d] = 1 } b.sort(function (a, b) { return c[b] - c[a] || b[0] - a[0] || b[1] - a[1] }); for (a = 0; a < b.length; a++) b[a][2] = c[b[a]]; return b }; alert(freqPairs( source ).join('\n')); |
Цитата:
Спасибо за код! Код рабочий - в смысле, что он выполняется и ничего не ломается. Правда он все равно не отсортировал, как надо, но его наверняка можно доточить. На самом деле я зарешал проблему самостоятельно. Применил другой алгоритм - шейкерную сортировку. Это конечно просто улучшение того же "пузырька", но мне вдруг помогло. То, что проблему решил - это хорошо... А вот то, что так и не понял, шоэтобыло - это плохо... |
Цитата:
|
Часовой пояс GMT +3, время: 20:56. |