javascript基本排序算法

咱們在這說一下基本的排序算法吧!

以下主要說到基礎的三種排序【冒泡,選擇,插入】,處理大量數據的【快排】

先說一下原理:

1、冒泡排序:

        冒泡排序是因爲使用這種排序算法排序時,數據值會像氣泡一樣從數組的一端漂浮到另一端。假設正在將一組數字按照升序排列,較大的值會浮動到數組的右側,而較小的值則會浮動到數組的左側。之所以會產生這種現象是因爲算法會多次在數組中移動,比較相鄰的數據,當左側值大於右側值時將它們進行互換。

    //冒泡排序
    bubbleSort() {
        for(var i = 1; i< this.data.length; i++) {
            for(var j = 0; j< this.data.length -i; j++) {
                if(this.data[j] < this.data[j+1]) {
                    var temp = this.data[j];
                    this.data[j] = this.data[j+1];
                    this.data[j+1] = temp;
                }
            }
        }
        return this.data
    }

2、選擇排序:

        選擇排序會用到嵌套循環。外循環從數組的第一個元素移動到倒數第二個元素;內循環從第二個數組元素移動到最後一個元素,查找比當前外循環所指向的元素小的元素。每次內循環迭代後,數組中最小的值都會被賦值到合適的位置。

    //選擇排序
    selectionSort() {
        for(var i = 0; i< this.data.length-1; i++) {
            for(var j = i+ 1;j < this.data.length; j++) {
                if(this.data[i] < this.data[j]) {
                    var temp = this.data[i];
                    this.data[i] = this.data[j];
                    this.data[j] = temp
                }
            }
        }
        return this.data;
    }

3、插入排序:

       插入排序類似於人類按數字或字母順序對數據進行排序。例如,讓班裏的每個學生上交一張寫有他的名字、學生證號以及個人簡介的索引卡片。學生交上來的卡片是沒有順序的,但是我想讓這些卡片按字母順序排好,這樣就可以很容易地與班級花名冊進行對照了。

      插入排序有兩個循環。外循環將數組元素挨個移動,而內循環則對外循環中選中的元素及它後面的那個元素進行比較。如果外循環中選中的元素比內循環中選中的元素小,那麼數組元素會向右移動,爲內循環中的這個元素騰出位置,就像之前介紹的姓氏卡片一樣。

    //插入排序
    insertionSort() {
        for(var i = 1; i< this.data.length; i++) {
            var temp = this.data[i];
            var j = i;
            while(j>0 && (this.data[j-1] >= temp)) {
                this.data[j] = this.data[j-1];
                --j
            }
            this.data[j] = temp;
        }
        return this.data;
    }
    insertionSort1() {
        for(var i = 1; i< this.data.length; i++) {
            for(var j = i; j>0; j--) {
                if(this.data[j-1] > this.data[j]) {
                    var temp = this.data[j];
                    this.data[j] = this.data[j-1];
                    this.data[j-1] = temp;
                }  else {
                    break;
                }
            }
        }
        return this.data
    }

以上這三種排序算法的複雜度非常相似,從理論上來說,它們的執行效率也應該差不多。要確定這三種算法的性能差異。經過測試:選擇排序和插入排序要比冒泡排序快,插入排序是這三種算法中最快的。

4、快速排序

        快速排序是處理大數據集最快的排序算法之一。它是一種分而治之的算法,通過遞歸的方式將數據依次分解爲包含較小元素和較大元素的不同子序列。該算法不斷重複這個步驟直到所有數據都是有序的。
        這個算法首先要在列表中選擇一個元素作爲基準值(pivot)。數據排序圍繞基準值進行,將列表中小於基準值的元素移到數組的底部,將大於基準值的元素移到數組的頂部

    //快速排序
    quickSort(arr) {
        if(arr.length == 0) {
            return [];
        }
        let left = [];
        let right = [];
        let point = arr[0];
        for(var i = 1; i< arr.length; i++) {
            if(arr[i] < point) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return this.quickSort(left).concat(point, this.quickSort(right))
    } 

源碼地址: https://github.com/GuoYuFu123/test-project/blob/master/arithmetic/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.html

參考:《數據結構與算法JavaScript描述》

原創不易,自由轉載,保留出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章