排序算法——冒泡排序

前面介紹了幾個常用的數(shù)據(jù)結構,還剩下兩個數(shù)據(jù)結構:樹和圖。這兩個結構理解概念較為容易,比如樹的基本概念,二分搜索樹的先序、中序、后序和層序遍歷順序,二分搜索樹的插入、查找和刪除操作等。但是要將這些東西使用代碼實現(xiàn),就比較困難了,我斷斷續(xù)續(xù)看了幾天也沒有看明白(主要糾結在二分搜索樹的刪除操作中的遞歸上)。因此這兩個數(shù)據(jù)結構我還需要再研究研究,以后再寫了。
這篇文章介紹冒泡排序算法。以下面的數(shù)組為例:

const arr:number[] = [5,4,6,2,1,8,0];

當使用冒泡排序對該數(shù)組進行排序(升序、降序)時,其核心思路如下:

  1. 從數(shù)組的第一項開始,比較每一項和其右側相鄰項
  2. 如果右側相鄰項大于(或小于,取決于升序排序還是降序排序)當前項,就將右側相鄰項和其進行交換
  3. 第一輪比較會得到數(shù)組中的最大值(升序排序)或者數(shù)組中的最小值(降序排序),第二輪比較會得到數(shù)組中的第二最大值或第二最小值,以此類推
  4. 假設數(shù)組的長度為 n,第一輪比較的次數(shù)為 n-1,第二輪比較的次數(shù)為 n-2,以此類推,直到比較次數(shù)為 1 為止。

下面是冒泡排序的代碼實現(xiàn):

class BubbleSort{
    private dataStore:number[] = null;
    // 裝載待比較的數(shù)組
    load(arr:number[]):void{
        this.dataStore = arr;
    }
    // 交換數(shù)組元素
    swap(arr:number[],index1,index2){
        let tmp:number = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = tmp;
    }
    // flag 參數(shù)用來設置升序或降序排序,默認為升序
    sort(flag:boolean=false):number[]{
        // 獲取帶比較數(shù)組的長度
        let len:number = this.dataStore.length;
        for(let i = len - 1;i > 0;i--){
            for(let j = 0; j < i;j++){
                // 升序排序
                if(!flag && this.dataStore[j] > this.dataStore[j + 1]){
                    this.swap(this.dataStore,j,j+1);
                }
                // 降序排序
                if(flag && this.dataStore[j] < this.dataStore[j + 1]){
                    this.swap(this.dataStore,j,j+1);
                }
            }
        }

        return this.dataStore;
    }
    toString():number[]{
        return this.dataStore;
    }
}

測試代碼:

const arr:number[] = [5,4,6,2,1,8,0];
const b = new BubbleSort();
b.load(arr);
b.sort();
console.log(b.toString())
b.sort(true);
console.log(b.toString())

運行結果:

[ 0, 1, 2, 4, 5, 6, 8 ]
[ 8, 6, 5, 4, 2, 1, 0 ]

在上面的 sort() 方法實現(xiàn)中,使用了兩個 for 循環(huán),其中外層循環(huán)用來提供本輪應該比較的次數(shù),內層循環(huán)用來從第一項開始,對數(shù)組進行相應次數(shù)的比較操作。

延伸

從冒泡排序的實現(xiàn)上,可以提取出兩個方法:獲取數(shù)組中最大值的 max() 方法和獲取數(shù)組中最小值的 min() 方法。下面是這兩個方法的實現(xiàn):

...
// 獲取最大值
max():number{
    let 
        len:number = arr.length,
        tmpArr:number[] = [...this.dataStore];
    
    for(let i = len - 1;i > 0;i--){
        if(tmpArr[i] > tmpArr[i + 1]){
            this.swap(tmpArr,i,i+1)
        }
    }
    return tmpArr[len-1];
}
// 獲取最大值
min():number{
    let 
        len:number = arr.length,
        tmpArr:number[] = [...this.dataStore];

    for(let i = len - 1;i > 0;i--){
        if(tmpArr[i] < tmpArr[i + 1]){
            this.swap(tmpArr,i,i+1)
        }
    }
    return tmpArr[len-1];
}
...

測試代碼:

const arr:number[] = [5,4,6,2,1,8,0];
const b = new BubbleSort();
b.load(arr);
console.log(b.max())
console.log(b.min())

運行結果:

8
0

完。

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

相關閱讀更多精彩內容

  • 基本思想: 冒泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到?jīng)]有反序的記錄為...
    史史小子閱讀 724評論 0 0
  • 一、算法簡介 冒泡排序(Bubble Sort)是一種計算機科學最簡單的排序算法之一。 它通過重復地走訪要排序的數(shù)...
    likly閱讀 665評論 0 0
  • 一 、算法介紹 (1)算法概述 排序算法有很多,其中最簡單直接的就是冒泡啦。冒泡排序(Bubble Sort)是一...
    FifiZhuang閱讀 292評論 0 0
  • 二叔是個成功人士。 這句話小楊不知道聽過多少次了。 新年的鐘聲奏響,遍地似乎都是五彩繽紛的色彩。 大年初一的下午,...
    溫不開閱讀 422評論 0 0
  • 作為一個20多歲的小青年,在小輩面前沒什么威信,在長輩面前就是個愣頭青。所有你的想法,大多被冠上年輕不懂事的帽子,...
    滿地蟲子爬閱讀 560評論 10 2

友情鏈接更多精彩內容