js實現數組排序


1. JavaScript的sort()方法

var array = [1,4,-8,-3,6,12,9,8];
function compare(val1,val2){
    return val1-val2;
};
array.sort(compare);
document.write(array);

sort()方法按照升序排列數組項,會調用每個數組項的toString()轉型方法,然后比較得到的字符串。
toString()方法是把布爾值或BooleanObject轉換為字符串,並返回結果。
compare()函數方法是一個比較函數,作為sort()方法的參數。

2. 冒泡排序(從后向前)

var array = [1,4,-8,-3,6,12,9,8];
function sort(arr){
    for(var j=0;j<arr.length-1;j++){
    //兩兩比較,如果前一個比后一個大,則交換位置。
       for(var i=0;i<arr.length-1-j;i++){
            if(arr[i]>arr[i+1]){
                var temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        } 
    }
}
sort(array);
document.write(array);

(1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個位置。
(2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
(3)針對所有的元素重復以上的步驟,除了最后一個。
(4)持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

3. 快速排序:遞歸思想,兩邊快速的排序,冒泡排序的改進

var array = [1,4,-8,-3,6,12,9,8];
function quickSort(arr){
//如果數組長度小於等於1,則返回數組本身
    if(arr.length<=1){
        return arr;
    }
    //定義中間值的索引
    var index = Math.floor(arr.length/2);
    //取到中間值
    var temp = arr.splice(index,1);
    //定義左右部分數組
    var left = [];
    var right = [];
    for(var i=0;i<arr.length;i++){
    //如果元素比中間值小,那么放在左邊,否則放右邊
        if(arr[i]<temp){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat(temp,quickSort(right));
}
document.write(quickSort(array));

Math.floor(x)方法是向下取整,返回小於或等於x的最接近的整數。
splice(index,num,item)方法是向數組中添加項目,或是從數組中刪除項目,並返回被刪除的項目。
(1)index是整數,被操作項目所在的位置(必須)
(2)num是整數,要刪除的項目的數量,如果為0,表示不刪除(必須)
(3)item是向數組中添加的新項目,可以是多個(可選)
push()方法是向數組末尾添加一個或多個新項目並返回新數組的長度
concat()方法連接兩個或多個數組,不會改變原有數組,返回一個新數組

4. 插入排序

var array = [1,4,-8,-3,6,12,9,8];
function insertSort(arr){
//假設第0元素是有序序列,第1元素之后是無序的序列。從第1元素開始依次將無序序列的元素插入到有序序列中
    for(var i=1; i<arr.length;i++){
        if(arr[i]<arr[i-1]){
            //取出無序序列中需要插入的第i個元素
            var temp = arr[i];
            //定義有序中的最后一個位置
            var j = i-1;
            arr[i] = arr[j];
            //比較大小,找到插入的位置
            while(j>=0&&temp<arr[j]){
                arr[j+1] = arr[j];
                j--;
            };
            //插入
            arr[j+1] = temp;
        }
    }
  }
insertSort(array)
document.write(array);

(1)從第一個元素開始,該元素可以認為已經被排序
(2)取出下一個元素,在已經排序的元素序列中掃描
(3)如果該元素(已排序)大於新元素,將該元素移到下一位置
(4)重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
(5)將新元素插入到下一位置中
(6)重復步驟2

5. 選擇排序

var array = [1,4,-8,-3,6,12,9,8];
function selectSort(arr){
    for(var i=0;i<arr.length;i++){
        //設置當前范圍最小值和索引
        var min = arr[i];
        var minIndex = i;
        //在該范圍選出最小值
        for(var j=i+1;j<arr.length;j++){
            if(min>arr[j]){
                min = arr[j];
                minIndex = j;
            }
        }
        //將最小值插入,並將原來位置的最小值刪除
        arr.splice(i,0,min);
        arr.splice(minIndex+1,1);
    }
}
selectSort(array);
document.write(array);

(1)在未排序序列中找到最小(大)元素
(2)並存放到排序序列的起始位置
(3)然后,再從剩余未排序元素中繼續尋找最小(大)元素
(4)然后放到已排序序列的末尾。
(5)以此類推

6. 原生 javascript 數組排序

function order(arr){
    var len=arr.length;
    var max=0; // 定義一個變量max,用於保存數組中的最大值。
    var num=0; // 定義一個變量num,用於保存數組中最大值的位置。
    var mid=0; // 定義一個變量mid,用於交換最大值和最后一個值。
    for(var i=len-1;i>0;i--){
        max=arr[0];
        for(var j=0;j<=i;j++){
            if(max<=arr[j]){ 
                max=arr[j]; // 獲取數組中最大值
                num=j;
            }
        }
        mid=arr[i]; // 將數組最后一個元素的值賦給中間變量;
        arr[num]=mid; // 將中間變量賦給最大值的元素;
        arr[i]=max; // 將最大值賦給數組最后一個元素;
    }
    return arr;
}

方法/步驟

1.獲取數組中最大的元素

var arr=[1,2,4,6,3,7,5];
var max=0;
for(var i=0;i<arr.length;i++){
    if(max<=arr[i]){
        max=arr[i];
    }
}

2.把最大值放到數組最后:
*定義一個中間變量來交換最大值和最后一個元素的值;
*定義一個變量來保存最大值所在的位置;

var arr=[1,2,4,6,3,7,5];
var len=arr.length;
var max=0;
var num=0;
var mid=0;
for(var i=0;i<len;i++){
  if(max<=arr[i]){
    max=arr[i];
    num=i;
  }
}
mid=arr[len-1]; // 將數組最后一個元素的值賦給中間變量;
arr[num]=mid; // 將中間變量賦給最大值的元素;
arr[len-1]=max; // 將最大值賦給數組最后一個元素;
// [1,2,4,6,3,5,7];

3.使用第二重循環來執行第2步:

var arr=[1,2,4,6,3,7,5];
var len=arr.length;
var max=0;
var num=0;
var mid=0;
for(var i=len-1;i>0;i--){
    max=arr[0];
    for(var j=0;j<=i;j++){
        if(max<=arr[j]){ 
            max=arr[j]; // 獲取數組中最大值
            num=j;
        }
    }
mid=arr[li]; 
arr[num]=mid; 
arr[i]=max; 

4.把第3步封裝在函數中:

function order(arr){
    var len=arr.length;
    var max=0; // 定義一個變量max,用於保存數組中的最大值。
    var num=0; // 定義一個變量num,用於保存數組中最大值的位置。
    var mid=0; // 定義一個變量mid,用於交換最大值和最后一個值。
    for(var i=len-1;i>0;i--){
        max=arr[0];
        for(var j=0;j<=i;j++){
            if(max<=arr[j]){ 
                max=arr[j]; // 獲取數組中最大值
                num=j;
            }
        }
        mid=arr[i]; // 將數組最后一個元素的值賦給中間變量;
        arr[num]=mid; // 將中間變量賦給最大值的元素;
        arr[i]=max; // 將最大值賦給數組最后一個元素;
    }
    return arr;
}

注意事項

數字排序為升序排列!
這種方法會改變原始數組!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM