JavaScript數組排序筆記

工作中經常用到的幾種排序方式,整理出來分享給大家以備不時之需。

1、array排序函數sort

使用Array的sort方法。

var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
arr.sort((a,b) => {
    return a - b
})
console.log(arr) // 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]

2、冒泡排序

將數組中的相鄰兩個元素進行比較,將比較大(較小)的數通過兩兩比較移動到數組末尾(開始),執行一遍內層循環,確定一個最大(最小)的數,外層循環從數組末尾(開始)遍歷到開始(末尾)。

var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
for(var i=0;i<arr.length;i++) {
    for(var j=0;j<arr.length-1;j++) {
        if (arr[j]>arr[j+1]) {
            let news = arr[j]
            arr[j] = arr[j+1]
            arr[j+1] = news
        }
    }
}
console.log(arr) 
// 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]

3、選擇排序

首先從原始數組中找到最小的元素,並把該元素放在數組的最前面,然後再從剩下的元素中尋找最小的元素,放在之前最小元素的後面,minIndex始終保存着最小值的位置的索引,隨着i的自增,遍歷的數組長度越來越短,直到完成排序。

var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
for(var i=0;i<arr.length;i++) {
    var minIndex=i;
    for(var j=i+1;j<arr.length;j++) {
        if(arr[j]<arr[minIndex]){
            minIndex=j
        }
    }
    if(minIndex!=i){
        var news = arr[i];
        arr[i]=arr[minIndex]
        arr[minIndex]=news
    }
}
console.log(arr) // 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]

4、插入排序

var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]

//假設第0個元素是一個有序的數列,第1個以後的是無序的序列,
//所以從第1個元素開始將無序數列的元素插入到有序數列中
for(var i = 1; i < arr.length; i++){
    //升序
    if(arr[i] < arr[i-1]){
        //取出無序數列中的第i個作爲被插入元素
        var guard = arr[i];
        //記住有序數列的最後一個位置,並且將有序數列位置擴大一個
        var j = i - 1;
        arr[i] = arr[j];

        //比大小,找到被插入元素所在的位置
        while(j >= 0 && guard < arr[j]){
            arr[j+1] = arr[j];
            j--;
        }

        //插入
        arr[j+1] = guard;
    }
}

console.log(arr) // 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]

5、快速排序

快速排序涉及到了遞歸,將一個數組的排序問題看成是兩個小數組的排序問題,而每個小的數組又可以繼續看成更小的兩個數組,一直遞歸下去,直到數組長度大小最大爲2。

var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]

function quickSort(arr){  
    if(arr.length<=1){//如果數組只有一個數,就直接返回;  
        return arr;  
    }  
    var num=Math.floor(arr.length/2);//找到中間數的索引值,如果是浮點數,則向下取整  
    var newValue=arr.splice(num,1);//找到中間數的值  
    var left=[],right=[];  
    for(var i=0;i<arr.length;i++){  
        if(arr[i]<newValue){  
            left.push(arr[i]);//基準點的左邊的數傳到左邊數組  
        }else{  
            right.push(arr[i]);//基準點的右邊的數傳到右邊數組  
        }  
    }  
    return quickSort(left).concat(newValue,quickSort(right));//遞歸不斷重複比較  
}  
    
console.log(quickSort(arr)) 
// 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章