幾種排序算法的javascript表示

首先寫一個(gè)測試用的生成隨機(jī)數(shù)的類:

class TestArr {
    constructor(numElems = 10000){
        this.dataStore = [];     //被排序的隨機(jī)數(shù)組
        this.numElems = numElems;   //被排序的數(shù)組長度,默認(rèn)值10000
    }

    //生成一個(gè)隨機(jī)數(shù)組
    setData(){
        for(let i = 0; i < this.numElems; ++i ){
            this.dataStore[i] = Math.floor(Math.random() * (this.numElems + 1));
        }
    }

    //每10個(gè)數(shù)為一組,返回每趟排序的結(jié)果
    toString(){
        var restr = '';
        for(var i = 0; i < this.dataStore.length; ++i){
            restr += this.dataStore[i] + ', ';
            if(i > 0 & i % 10 == 0){
                restr += '\n';
            }
        }
        return restr;
    }

    //交換兩個(gè)元素的內(nèi)容
    swap(arr, index1, index2){
        let temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }
}

下面每一種排序算法使用一個(gè)簡單的類嚼酝,并繼承隨機(jī)數(shù)的類

冒泡排序

冒泡排序
class BubbleSort extends TestArr {
    constructor(numElems){
        super(numElems)
    }

    sort(){
        let data = this.dataStore
        for(let i = this.dataStore.length; i > 1; -- i){
            for(let j = 0; j < i - 1; j ++){
                if(data[j] > data[j + 1]){
                    this.swap(data, j, j + 1)
                }
            }
           // console.log(this.toString())   
        }
    }
}

通過以下方式測試排序結(jié)果 和 排序時(shí)間:

const bSort =new BubbleSort()  //如果不加參數(shù)莺琳,則默認(rèn)數(shù)值是10000
bSort.setData()
console.time('冒泡排序')
bSort.sort()
console.timeEnd('冒泡排序')
console.log(sort.toString())

直接插入排序

插入排序
class InsertionSort extends TestArr {
    constructor(numElems){
        super(numElems);
    }

    sort(){
        let data = this.dataStore
        let temp, j;

        for(let i = 1; i < data.length; i ++ ){
            temp = data[i];
            j = i;
            while (j > 0 && data[j - 1] > temp) {
                this.swap(data, j, j - 1);
                -- j;
            }
            data[j] = temp;

            // console.log(this.toString());
        }
    }
}

可使用類似的方式測試排序時(shí)間和結(jié)果

選擇排序

選擇排序
class SelectionSort extends TestArr{
    constructor(numElems){
        super(numElems);
    }
    sort(){
        let [min, data, temp] = [null, this.dataStore, null]
        for(let i = 0; i < data.length; i ++){
            min = i;
            for(let j = i; j < data.length; j ++){
                if(data[j] < data[min]){
                    min = j;
                }
            }
            this.swap(data, i, min);
            // console.log(this.toString())
        }
    }
}

希爾排序

希爾排序
希爾排序
class ShellSorting extends TestArr{
    constructor(numElems){
        super(numElems);
        this.gaps = [5, 3, 1];
    }

    sort(){
        let data = this.dataStore;
        let gaps = this.gaps;
        let temp;

        for(let g = 0; g < gaps.length; g++ ){
            for(let i = gaps[g]; i < data.length; i ++){
                temp =  data[i];
                let j;
                for(j = i; j >= gaps[g] && data[j - gaps[g]] > temp;  j -= gaps[g]){
                    data[j] = data[j - gaps[g]];
                }
                data[j] = temp;
            }
        }
    }
}

快速排序

快速排序在數(shù)據(jù)很大的時(shí)候嚷缭,優(yōu)勢是很明顯的,在數(shù)據(jù)較小的時(shí)候忆首,效率反而會相對較低

快速排序
class QuikSort extends TestArr {
    constructor(numElems) {
        super(numElems);
    }

    sort(arr){
        if(arr.length == 0) return arr;

        let [temp, less, large] = [arr[0], [], []];
        for(var i = 1; i < arr.length; i ++){
            if(arr[i] < temp){
                less.push(arr[i]);
            }else{
                large.push(arr[i]);
            }
        }
        return this.quikSort(less).concat(temp, this.quikSort(large));
    }
}

通過以下方式測試排序結(jié)果 和 排序時(shí)間:

const qSort =new QuikSort()  //如果不加參數(shù),則默認(rèn)數(shù)值是10000
qSort.setData()
console.time('快速排序')
console.log(qSort.sort(qSort.dataStore))
console.timeEnd('快速排序')

算法的時(shí)間復(fù)雜度和穩(wěn)定性

排序算法 時(shí)間復(fù)雜度 穩(wěn)定性
插入排序 O(n*n) 1
希爾排序 O(n*n) 0
冒泡排序 O(n*n) 1
選擇排序 O(n*n) 0
快速排序 O(nlogn) 0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末被环,一起剝皮案震驚了整個(gè)濱河市糙及,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筛欢,老刑警劉巖浸锨,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異版姑,居然都是意外死亡柱搜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門剥险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聪蘸,“玉大人,你說我怎么就攤上這事表制〗∨溃” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵夫凸,是天一觀的道長浑劳。 經(jīng)常有香客問我,道長夭拌,這世上最難降的妖魔是什么魔熏? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任衷咽,我火速辦了婚禮,結(jié)果婚禮上蒜绽,老公的妹妹穿的比我還像新娘镶骗。我一直安慰自己,他們只是感情好躲雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布鼎姊。 她就那樣靜靜地躺著,像睡著了一般相赁。 火紅的嫁衣襯著肌膚如雪相寇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天钮科,我揣著相機(jī)與錄音唤衫,去河邊找鬼。 笑死绵脯,一個(gè)胖子當(dāng)著我的面吹牛佳励,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛆挫,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赃承,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悴侵?” 一聲冷哼從身側(cè)響起瞧剖,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畜挨,沒想到半個(gè)月后筒繁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巴元,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年毡咏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逮刨。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呕缭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出修己,到底是詐尸還是另有隱情恢总,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布睬愤,位于F島的核電站片仿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尤辱。R本人自食惡果不足惜砂豌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一厢岂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阳距,春花似錦塔粒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咖熟,卻和暖如春圃酵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馍管。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工辜昵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咽斧。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像躬存,于是被迫代替她去往敵國和親张惹。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理岭洲,服務(wù)發(fā)現(xiàn)宛逗,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 總結(jié)一下常見的排序算法盾剩。 排序分內(nèi)排序和外排序雷激。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,346評論 0 1
  • 一. 寫在前面 要學(xué)習(xí)算法告私,“排序”是一個(gè)回避不了的重要話題屎暇,在分析完并查集算法和常用數(shù)據(jù)結(jié)構(gòu)之后,今天我們終于可...
    Leesper閱讀 2,531評論 0 40
  • 讀者朋友們驻粟,作者大大已很久沒有發(fā)話啦根悼,這次就用《墨下正馨》來補(bǔ)給吧! 楓葉飄零蜀撑,吹起了一陣陣思念挤巡。 鋼琴旁的墨染瞳...
    白嘉淺閱讀 118評論 2 3
  • 一晃眼,北京已經(jīng)呆了幾年了酷麦。 最近因?yàn)樯】蟊埃坏貌粡墓┞毜墓倦x職養(yǎng)病。 幾年沃饶,恍然一夢母廷。病中又逢失業(yè)轻黑,錢包的羞澀...
    韓嫣閱讀 364評論 1 2