算法 - 冒泡排序、選擇排序、快速排序

【冒泡排序】原理:

針對所有的元素重複以上的步驟, 除了最後一個。

持續每次對越來越少的元素重複上面的步驟, 直到沒有任何一對數字需要比較。

比較相鄰的元素。 如果第一個比第二個大, 就交換他們兩個。

對每一對相鄰元素做同樣的工作, 從開始第一對到結尾的最後一對, 在這一點, 最後的元素應該會是最大的數。

var arr = [12, 3, 569, 78, 0, -56, 1223, 11, 16, 13, 1, 12];
function bubbleSort(arr) {
    if (Array.isArray(arr)) { //是數組
        for (var i = 0; i < arr.length - 1; i++) { //控制輪數  -1:12個數字只需要比較11輪
            for (var j = 0; j < arr.length - i - 1; j++) { //第i輪,表示已經排序好i個數字。  -1:12個數字兩兩比較11次。
                if (arr[j] > arr[j + 1]) { //比較相鄰的元素。 如果第一個比第二個大, 就交換他們兩個
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    } else { //不是數組
        throw new Error('請輸入數組'); //新建錯誤對象,包含錯誤信息,拋出錯誤 throw
    }
}
console.log(bubbleSort(arr))

【選擇排序】原理:

第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置

然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾

以此類推,直到全部待排序的數據元素的個數爲零

var arr = [12, 3, 569, 78, 0, -56, 1223, 11, 16, 13, 1, 12];
function selectSort(arr) {
    if (Array.isArray(arr)) { //是數組
        for (var i = 0; i < arr.length; i++) {
            var minindex = i;  //依次假設的最小值的索引下標爲i
            var minvalue = arr[minindex];  ////假設的最小值
            for (var j = i + 1; j < arr.length; j++) {
                if (arr[j] < minvalue) { //如果當前的數組項的值比最小值還要小,當前的值就是這次最小值
                    minvalue = arr[j];  //當前的值就是最小值
                    minindex = j;  //此時的j就是最小值的索引下標
                }
            }
            //內層的for循環走完一輪,才能得到真正的最小值。纔可以進行交換
            if(minindex !== i){  //代表當前假設的最小值不成立的。找到真正的最小值的索引下標
                var temp = arr[minindex];
                arr[minindex] = arr[i];
                arr[i] = temp;
            }
        }
        return arr;
    } else { //不是數組
        throw new Error('請輸入數組'); //新建錯誤對象,包含錯誤信息,拋出錯誤 throw
    }
}
console.log(selectSort(arr))

【快速排序】原理:

待排序的數組中任意截取(splice:改變原數組)一位,截取相對中間一些的位置 - 中間值

準備兩個數組left/right,用餘下的數字分別和中間值進行比較

如果比截取的中間值大放到right數組(push),如果比中間值小放到左邊的數組(push)

分別對left和right數組進行遞歸操作,直到數組的每一項長度爲1或者0(基點)

最終利用concat方法將所有的數組連接起來

var arr = [12, 3, 3, 3, 3, 569, 78, 0, -56, 1223, 1223, 1223, 11, 16, 13, 1, 12];

function quickSort(arr) {
    if (Array.isArray(arr)) { //數組
        if (arr.length <= 1) { //長度<=1 輸出數組項的值,設爲基點
            return arr;
        } else { //長度>1 進行遞歸比較
            var midindex = parseInt(arr.length / 2) //獲取中間值的索引
            var midvalue = arr.splice(midindex, 1)[0]; //改變原數組,截取1位。返回值還是數組。
            var left = [];
            var right = [];
            for (var i = 0; i < arr.length; i++) {
                if (arr[i] < midvalue) {
                    left.push(arr[i]);
                } else { //排序
                    right.push(arr[i]);
                }
                // else if (arr[i] > midvalue) {//排序+去重
                //     right.push(arr[i]);
                // }
            }
            return quickSort(left).concat(midvalue, quickSort(right)); //最終的拼接
        }
    } else {
        throw new Error('請輸入數組');
    }
}
console.log(quickSort(arr));

 

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