1. 程式人生 > >冒泡排序與快速排序數組越界?

冒泡排序與快速排序數組越界?

開始 new () array 不變 特殊性 color 相等 ++

冒泡排序原理:

1.比較第一項和第二項;
2.如果第一項應該排在第二項之後, 那麽兩者交換順序;
3.比較第二項和第三項;
4.如果第二項應該排在第三項之後, 那麽兩者交換順序;
5.以此類推直到完成排序;

實例說明:

將數組[3, 2, 4, 5, 1]以從小到大的順序進行排序:

1. 3應該在2之後, 因此交換, 得到[2, 3, 4, 5, 1];

2. 3, 4順序不變, 4, 5也不變, 交換5, 1得到[2, 3, 4, 1, 5];

3. 第一次遍歷結束, 數組中最後一項處於正確位置不會再有變化, 因此下一次遍歷可以排除最後一項;

4. 開始第二次遍歷, 最後結果為[2, 3, 1, 4, 5], 排除後兩項進行下一次遍歷;

5. 第三次遍歷結果為[2, 1, 3, 4, 5]; 6. 最後得到[1, 2, 3, 4, 5], 排序結束;

  function sort1 (arr) {
    for (var i = 0; i < arr.length; i ++) {
      // arr.length-i的意義:每次遍歷去掉後面已經排序的好的元素
      for (var j = 0; j < arr.length-i; j ++) {
        if (arr[j] > arr[j+1]) {
          var temp = arr[j];
          arr[j] 
= arr[j+1]; arr[j+1] = temp; } } } return arr; }

上面的代碼 我最初看到的時候有個小疑問,註意if() 判斷裏面的 arr[j+1],比如數組arr = [2, 1, 3, 5] if(arr[j] > arr[j+1])

那麽當j=3時 j+1就是arr[4] 這時數組不會發生越界嗎?

其實呢在js中 我們知道數組其實是new Array()函數創建的對象,當我們訪問對象中不存在的屬性時

比如obj.a 或者 arr[6](這個索引就是數組的屬性)

值就為undefined

那麽在if()語句中與number類型比大小,undefined隱士轉換為number類型就是NaN , js中定義NaN與任何數值都不相等包括它自己,

所以if()判斷為false 下面的賦值語句也就不會執行不會報錯。

由於js語言的特殊性這個越界也就沒問題,但是同事試了下用c#是無法執行的。

冒泡排序與快速排序數組越界?