冒泡排序的可視化

這是IFE基礎(chǔ)JavaScript練習(xí)(二),實(shí)現(xiàn)冒泡排序的可視化,用高度表示數(shù)字的大小,然后可視化的進(jìn)行排序(由于冒泡排序比較簡單,我就先從冒泡排序開始)

效果圖如下

冒泡排序

點(diǎn)擊排序

什么是冒泡排序

冒泡排序是一種簡單的交換類排序方法。基本思想是:從頭開始掃描待排序數(shù)組,按順序比較相鄰兩元素的大小。在第一趟排序中,從第一個(gè)數(shù)開始,比較其與后一位元素的大小,如果是逆序,就交換順序,再對(duì)下一位元素開始操作。然后第二趟的時(shí)候?qū)η皀-1個(gè)進(jìn)行操作(因?yàn)樽詈笠晃灰呀?jīng)是最大的了)

具體來說,比如

原始數(shù)組
[13, 46, 25, 39, 30]

第一次排序
[13, 46, 25, 39, 30] (從第一位開始比較是否逆序,如果是則交換位置)
[13, 46, 25, 39, 30] (逆序,交換位置,繼續(xù)比較)
[13, 25, 46, 39, 30] (逆序,交換位置,繼續(xù)比較)
[13, 25, 39, 46, 30] (逆序,交換位置,繼續(xù)比較)
[13, 25, 39, 30, 46] (第一次完成)

第二次排序
[13,** 25**, 39, 30, 46]
[13, 25, 39, 30, 46]
[13, 25, 39, 30, 46] (逆序,交換順序)
[13, 25, 30, 39, 46] (第二次完成,注意最后一位不再進(jìn)行比較)

算法實(shí)現(xiàn)

var sort = function (arr) {
    for (var k = 0; k < arr.length; k++) {
        for (var j = 0; j < arr.length - k - 1; j++) {
            if (arr[j] > arr[j + 1]) {
               var temp = arr[j];
               arr[j] = arr[j + 1];
               arr[j + 1] = temp;
             }
         }
    }
}

接下來是可視化

我們要用高度來表示數(shù)組元素的大小,可以這樣

function printf() {
        wrap.innerHTML = "";  //清空上次數(shù)據(jù)
        for (var i = 0; i < arr.length; i++) {
            var div = document.createElement("div");
            div.setAttribute("class", "count"); //設(shè)置class方便寫樣式
            div.innerHTML = arr[i];
            wrap.appendChild(div);
            div.style.height = (5 * arr[i]) + "px"; //設(shè)置高度
            div.style.left = (i * 35) + "px"; //設(shè)置絕對(duì)定位的位置
        }
    }

我們?cè)赾ss里給它們絕對(duì)定位,然后遍歷數(shù)組進(jìn)行輸出,根據(jù)大小設(shè)置高度。如果和我一樣有輸入和輸出的按鈕可以給按鈕綁定這個(gè)事件。如果只有一個(gè)輸入框的話,可以給輸入框綁定失焦事件,注意對(duì)數(shù)據(jù)正確性做驗(yàn)證。

現(xiàn)在就變成這樣了

怎么讓它動(dòng)起來呢

思路:用數(shù)組記錄每趟排序后的狀態(tài),定時(shí)根據(jù)狀態(tài)數(shù)組更新DOM,這樣看起來就像動(dòng)畫一樣

var sort = document.getElementById("sort");
    sort.onclick = function () {
        if (arr.length === 0) {
            alert("還沒有輸入數(shù)字哦!")
        } else {
            var domArr = [].slice.call(document.getElementsByClassName("count"));
            var state = [];
            var sort = function (arr) {
                for (var k = 0; k < arr.length; k++) {
                    for (var j = 0; j < arr.length - k - 1; j++) {
                        if (arr[j] > arr[j + 1]) {
                            var temp = arr[j];
                            arr[j] = arr[j + 1];
                            arr[j + 1] = temp;
                            state.push(JSON.parse(JSON.stringify(arr)));
                        }
                    }
                }
            }

            sort(arr);
            var draw = function () {
                var bar, numArr;
                numArr = state.shift() || [];
                var q = 0;
                for (bar in domArr) {
                    if (numArr[bar] !== undefined) {
                        domArr[bar].style.height = (5 * parseInt(numArr[bar])) + "px";
                        domArr[bar].style.left = (q * 35) + "px";
                        domArr[bar].innerHTML = numArr[bar];
                        q++;
                    }
                }
            }
            setInterval(draw, 200);
        }
    }

ok啦,源碼在這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 曾經(jīng)有一份美好的愛情放在我的面前我沒有珍惜。等到失去后才后悔莫及。如果可以再對(duì)小李說。毛欣想說。這輩子無緣再牽手。...
    毛欣與小李閱讀 3,378評(píng)論 0 13
  • 排序的基本概念 在計(jì)算機(jī)程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個(gè)關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,576評(píng)論 1 4
  • 一、 單項(xiàng)選擇題(共71題) 對(duì)n個(gè)元素的序列進(jìn)行冒泡排序時(shí),最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,437評(píng)論 0 10
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,308評(píng)論 0 52
  • 人世間的疾病千奇百怪,常見病就有幾百種,而真正能說清病因的疾病卻寥寥無幾。怎么辦呢?中醫(yī)里有一句精華叫"治病但求其...
    前成健康閱讀 1,941評(píng)論 0 0

友情鏈接更多精彩內(nèi)容