国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript實(shí)現(xiàn)冒泡排序

Aomine / 1300人閱讀

說明

對數(shù)組進(jìn)行 冒泡排序 算是比較簡單的,冒泡排序也是容易理解的一種排序算法了,在面試的時候,很可能就會問到。

實(shí)現(xiàn)原理
數(shù)組中有 n 個數(shù),比較每相鄰兩個數(shù),如果前者大于后者,就把兩個數(shù)交換位置;這樣一來,第一輪就可以選出一個最大的數(shù)放在最后面;那么經(jīng)過 n-1(數(shù)組的 length - 1) 輪,就完成了所有數(shù)的排序。

好的,我們先來實(shí)現(xiàn)找數(shù)組中的最大數(shù),并把他放到數(shù)組最后。

var arr = [3,4,1,2];
// 遍歷數(shù)組,次數(shù)就是arr.length - 1
for (var i = 0; i < arr.length - 1; i++) {
    // 如果前一個數(shù) 大于 后一個數(shù) 就交換兩數(shù)位置
    if (arr[i] > arr[i + 1]) {
        var temp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = temp;
    }
}
console.log(arr)  // [3, 1, 2, 4]

我們能找到數(shù)組中最大的數(shù),放到最后,這樣重復(fù) arr.length - 1 次,便可以實(shí)現(xiàn)數(shù)組按從小到大的順序排好了。

var arr = [3,4,1,2];
// 遍歷數(shù)組,次數(shù)就是arr.length - 1
for (var j = 0; j < arr.length - 1; j++) {
    // 這里 i < arr.length - 1 ,要思考思考合適嗎?我們下面繼續(xù)說
    for (var i = 0; i < arr.length - 1; i++) {
        if (arr[i] > arr[i + 1]) {
            var temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
        }
    }
}
console.log(arr)  // [1,2,3,4]

雖然上面的代碼已經(jīng)實(shí)現(xiàn)冒泡排序了,但就像注釋中提到的,內(nèi)層 for 循環(huán)的次數(shù)寫成,i < arr.length - 1 ,是不是合適呢?
我們想一下,當(dāng)?shù)谝淮危业阶畲髷?shù),放到最后,那么下一次,遍歷的時候,是不是就不能把最后一個數(shù)算上了呢?因?yàn)樗褪亲畲蟮牧耍粫霈F(xiàn),前一個數(shù)比后一個數(shù)大,要交換位置的情況,所以內(nèi)層 for 循環(huán)的次數(shù),改成 i < arr.length - 1 -j ,才合適,看下面的代碼。

var arr = [3, 4, 1, 2];
function bubbleSort (arr) {
  for (var j = 0; j < arr.length - 1; j++) {
    // 這里要根據(jù)外層for循環(huán)的 j,逐漸減少內(nèi)層 for循環(huán)的次數(shù)
    for (var i = 0; i < arr.length - 1 - j; i++) {
      if (arr[i] > arr[i + 1]) {
        var temp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = temp;
      }
    }
  }
  return arr;
}
bubbleSort(arr);

我們想下這個情況,當(dāng)原數(shù)組是,
arr = [1,2,4,3];
在經(jīng)過第一輪冒泡排序之后,數(shù)組就變成了
arr = [1,2,3,4];
此時,數(shù)組已經(jīng)排序完成了,但是按上面的代碼來看,數(shù)組還會繼續(xù)排序,所以我們加一個標(biāo)志位,如果某次循環(huán)完后,沒有任何兩數(shù)進(jìn)行交換,就將標(biāo)志位 設(shè)置為 true,表示排序完成,這樣我們就可以減少不必要的排序,提高性能。

完整代碼
var arr = [3, 4, 1, 2];
function bubbleSort (arr) {
  var max = arr.length - 1;
  for (var j = 0; j < max; j++) {
    // 聲明一個變量,作為標(biāo)志位
    var done = true;
    for (var i = 0; i < max - j; i++) {
      if (arr[i] > arr[i + 1]) {
        var temp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = temp;
        done = false;
      }
    }
    if (done) {
      break;
    }
  }
  return arr;
}
bubbleSort(arr);
性能

時間復(fù)雜度: 平均時間復(fù)雜度O(n*n) 、最好情況O(n)、最差情況O(n*n)
空間復(fù)雜度: O(1)
穩(wěn)定性:穩(wěn)定

時間復(fù)雜度指的是一個算法執(zhí)行所耗費(fèi)的時間
空間復(fù)雜度指運(yùn)行完一個程序所需內(nèi)存的大小
穩(wěn)定指,如果a=b,a在b的前面,排序后a仍然在b的前面
不穩(wěn)定指,如果a=b,a在b的前面,排序后可能會交換位置

總結(jié)

1、外層 for 循環(huán)控制循環(huán)次數(shù)
2、內(nèi)層 for 循環(huán)進(jìn)行兩數(shù)交換,找每次的最大數(shù),排到最后
3、設(shè)置一個標(biāo)志位,減少不必要的循環(huán)

好的,下一篇文章,來實(shí)現(xiàn)下冒泡排序的可視化,把冒泡排序的過程展示出來。
JavaScript實(shí)現(xiàn)冒泡排序 可視化

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93970.html

相關(guān)文章

  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 冒泡排序、插入排序、選擇排序

    摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r間復(fù)雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩(wěn)定的排序算法。選擇排序思路選擇排序算法的實(shí)現(xiàn)思路有點(diǎn)類似插入排序,也分已排序區(qū)間和未排序區(qū)間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,...

    canger 評論0 收藏0
  • JavaScript實(shí)現(xiàn)冒泡排序 可視化

    摘要:說明上次寫了實(shí)現(xiàn)冒泡排序,只是簡單的說了冒泡排序算法是什么,怎么實(shí)現(xiàn),這次來實(shí)現(xiàn)將冒泡排序的過程展現(xiàn)出來。總結(jié)上面的兩個版本的思路基本一樣,用一句話概括就是,記錄冒泡排序所有的改變,將這些改變一步一步的顯示出來。 說明 上次寫了 JavaScript實(shí)現(xiàn)冒泡排序 ,只是簡單的說了冒泡排序算法是什么,怎么實(shí)現(xiàn),這次來實(shí)現(xiàn)將冒泡排序的過程展現(xiàn)出來。 解釋 先來個簡單的版本,看效果圖 sh...

    RebeccaZhong 評論0 收藏0
  • Javascript實(shí)現(xiàn)冒泡排序與快速排序以及對快速排序的性能優(yōu)化

    摘要:實(shí)現(xiàn)快速排序介紹通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序序列。 冒泡排序 介紹 重復(fù)遍歷要排序的元素列,依次比較兩個相鄰的元素,前一個元素若比后一個元素大則互換位置。以升序排序?yàn)槔畲蟮脑貢诘谝淮伪闅v后冒泡到數(shù)組的末端。假如數(shù)組...

    dadong 評論0 收藏0
  • javascript冒泡排序

    摘要:冒泡排序可謂是最經(jīng)典的排序算法了,它是基于比較的排序算法,其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,排序數(shù)量較小時性能較好。也可以實(shí)現(xiàn)大數(shù)放在前面,小數(shù)放在后面,如果前面的數(shù)據(jù)比后面的小,就交換兩個的位置。要實(shí)現(xiàn)上述規(guī)則需要用到兩層循環(huán)。 冒泡排序可謂是最經(jīng)典的排序算法了,它是基于比較的排序算法,其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,排序數(shù)量較小時性能較好。 算法原理 相鄰的數(shù)據(jù)進(jìn)行兩兩比較,小數(shù)放在前面,大數(shù)放在后面,如果前面...

    wanghui 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 十大經(jīng)典排序算法匯總

    摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。這應(yīng)該是目前較為簡單的十大經(jīng)典排序算法的文章講解了吧。比如原本在的前面,而,排序之后,在的后面十大經(jīng)典排序算法冒泡排序思想冒泡排序只會操作相鄰的兩個數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbvHet); 1. 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就...

    zsy888 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<