Javascript按算法排序,jquery也许
好吧,我正在尝试创建一个排序应用程序,但它有点破坏了我的想法。 也许是因为思考太多了。
我想要的是什么
- 我想从数组中排序值,也许使用冒泡排序
- 我想将每次迭代推送到表的
- 并能够知道哪些值已被替换
必然会发生什么
- 每次迭代,我都会得到一个值列表
- 每个列表都会突出显示受影响的值
我现在有什么
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 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('
' + val); }) } } $(document).ready(function(){ sort.init(); }) 如果可能的话,我想逐个显示值,也许设置超时,对吧?
是的,如果你想“看到”算法的进度,
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 = ["
"], i = 0, l = list.length; for (i; i < l; ++i) { str.push("
"); 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 "); } str.push("", list[i], "