Сортировка в ширину
Доброго времени суток... Приспичило меня (просто ради интереса) сравнить скорость работы сортировки в ширину с сортировкой быстрой. Причём решил сделать это в firebug-е...
Код следующий: console.clear(); // Формирование массива var w = 10 * 1000; // разброс значений var h = 400 * 1000; // количество элементов var a = new Array(h); // массив console.time('Make array'); for( var i = 0; i < h; ++i ) { a[i] = Math.floor(Math.random() * w); } console.timeEnd('Make array'); // Cортировка "в ширину" console.time('WideSort'); var b = new Array(w); var c = new Array(h); for( i = 0; i < h; ++i ) { if( !b[ a[i] ] ) b[ a[i] ] = 1; else ++b[ a[i] ]; } var z = -1; for( i = 0; i < w; ++i ) { for( var t = 0; t < b[i]; ++t ) { z++; c[z] = i; } } console.timeEnd('WideSort'); // Быстрая сортировка console.time('QuickSort'); function qsort( mas, f, t ) { var l = f, r = t; var middle = Math.floor( (t + f)/ 2 ); var m = mas[ middle ]; do { while( mas[l] < m ) ++l; // находим первый слева элемент больший центрального while( mas[r] > m ) --r; // находим первый правый элемент меньший центрального if( l <= r ) { // меняем местами больший чем М элемент слева, с меньшим чем М, var temp = mas[l]; // элементом справа mas[l] = mas[r]; mas[r] = temp; ++l; --r; } } while ( r >= l ); // пока не кончится отрезок массива if( f < r ) qsort( mas, f, r ); if( t > l ) qsort( mas, l, t ); } qsort( a, 0, a.length - 1 ); console.timeEnd('QuickSort'); // Проверка for( i = 0; i < h; ++i ) if( a[i] != c[i] ) { console.log('a[i] = ',a[i],' c[i] = ',c[i]); break; } Результат ужасен, сортировка в ширину у меня всегда проигрывает, какие бы я исходные данные не ставил. Проверил тоже в Delphi, там ситуация более идеологически верная - быстрая сортировка медленнее примерно в 10 раз, вплоть до увеличения h до 2-3 миллионов. Код:
program Project1; P.S. Я в js совсем "зелёный" :) #upd Chrome: Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
for( i = 0; i < h; ++i ) { var p = a[i]; if( !b[ p ] ) b[ p ] = 1; else ++b[ p ]; } |
Цитата:
связанно может быть с тем, что в Delphi слишком больше накладные расходы на вызов функции, или еще с чем-то. Почитайте про сложность алгоритмов, и подумайте как от сложности зависит скорость. только хорошо подумайте. PS Откуда вы взяли вообще такое дивное название "сортировка в ширину". гугл выдает в первую очередь эту тему) PPS *тут должно было быть что-то нехорошее про Delphi. Но может быть и ваша реклама*. |
Цитата:
Цитата:
Цитата:
Цитата:
|
Запустил ваш пример (Firefox 3.6)
Цитата:
|
Kolyaj, о_О... unix-версия? У меня 3.6.15 (win32) выдаёт:
Цитата:
|
WinXP.
В коде из первого сообщения ничего не менял. |
Часовой пояс GMT +3, время: 07:40. |