好的,我正在尝试创建一个排序应用程序,但是它有点让我失望。也许是因为想得太多。
我想要什么
<tr>
必须发生什么
我目前有什么
var sort = { init : function() { sort.vars.$oldList = [6,4,7,1,8]; sort.play.bubble(); } } sort.vars = { $oldList : new Array(), $newList : new Array() } sort.play = { bubble : function() { var list = sort.vars.$oldList; var n = list.length; var isSorted = false; while(!isSorted) { var tmp, i; isSorted = true; for (i = 0; i < n; i++) { if (list[i] > list[i+1]) { tmp = list[i]; list[i] = list[i+1]; list[i+1] = tmp; isSorted = false; } sort.ui.pushtToTable(list); } } } } sort.ui = { pushtToTable : function(list) { $.each(list, function(n, val){ $('tr').append('<td>' + val); }) } } $(document).ready(function(){ sort.init(); })
如果可能的话,我想一一显示值,也许设置一个超时时间,对不对?
是的,setTimeout如果您想“查看”算法的进度,这是一个好主意。但是,setTimeout仅接受函数作为参数,因此排序算法的每次迭代都必须在单独的函数中执行。请参见以下代码作为示例(该代码不会在每次迭代中产生输出,而是会为交换操作“动画化”,但是我敢肯定,您可以轻松地调整它以适应您的需求)。
setTimeout
演示 (JSFiddle)
var SORT = function(type, list, selector){ var container, containerTr, animSteps = []; // Show all elements in the container var printArray = function(list){ var str = ["<table>"], i = 0, l = list.length; for (i; i < l; ++i) { str.push("<tr><td>", list[i], "</td></tr>"); } str.push("</table>"); container.html(str.join("")); }; // This is the interesting part... ;) var swap = function(list, i1, i2) { var tmp = list[i1]; list[i1] = list[i2]; list[i2] = tmp; // Add 3 functions for each swapping action: // 1. highlight elements, 2. swap, 3. remove highlight animSteps.push(function(){ containerTr.eq(i1).add(containerTr.eq(i2)).addClass("highlight"); }, function(){ var tmp = containerTr.eq(i1).text(); containerTr.eq(i1).text(containerTr.eq(i2).text()); containerTr.eq(i2).text(tmp); }, function(){ containerTr.eq(i1).add(containerTr.eq(i2)).removeClass("highlight"); }); }; var animation = function(){ // Execute all iteration functions one after another if (animSteps.length) { setTimeout(function(){ animSteps.splice(0,1)[0](); animation(); }, 250); } }; // Collection of sorting algorithms var algorithms = { bubblesort: function(list) { for (var n = list.length; n > 1; --n) { for (var i = 0; i < n-1; ++i) { if (list[i] > list[i+1]) { swap(list, i, i+1); } } } } // Add more algorithms using "swap" here... }; if (algorithms[type] != undefined) { container = $(selector); printArray(list); containerTr = container.find("tr"); algorithms[type](list); this.sorted = list; animation(); } }; // Usage: var s = new SORT("bubblesort", [5,8,2,4,1,9,7,3,0,6], "#container"); console.log(s.sorted); //the sorted array