JavaScript實現(xiàn)排序算法

排序算法主要用于元素的數(shù)組排序,常見的排序算法有冒泡排序,選擇排序,插入排序,希爾排序,快速排序,歸并排序等,這些排序算法都可以用JavaScript去實現(xiàn)。下面的排序算法都可以假設是從小到大排序,從大到小可以相應進行轉換。

冒泡排序

冒泡排序的思想是從頭遍歷要排序的數(shù)組,比較相鄰的兩個數(shù)字,如果前面位置的數(shù)字大于后面位置的數(shù)字那么就讓他們交換位置,否則不進行任何操作,遍歷完一次之后,最大的數(shù)字放到了數(shù)組后面,然后在從頭遍歷,進行同樣的操作, 就可以將第二大的數(shù)放到倒數(shù)第二個位置,依次進行下去,直到所有的數(shù)排好位置為止,冒泡排序實現(xiàn)的代碼如下

functon bubbleSort(arr) {
    for (var i = 0; i < arr.length-1; i++) {
        for (var j = 0; j < arr.length-1-i; j++) {
            if (arr[j] > arr[j+1]) {
                // 交換位置
                var temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        return arr;
    }
}

選擇排序

選擇排序的基本思想是先找到數(shù)組中最小的元素,將它和數(shù)組的第一個元素交換位置,再找到數(shù)組中第二小的元素,將它和數(shù)組的第二個元素交換位置,依次進行下去,直到整個數(shù)組排好序為止。選擇排序代碼實現(xiàn)如下:

functon selectSort(arr) {
    for (var i = 0; i < arr.length-1; i++) {
        var min = arr[i];
        for (var j = i+1; j < len; j++) {
            if (arr[j] < min) {
                var temp = min;
                min = arr[j];
                arr[j] = temp;
            }
            arr[i] = min;
        }
    }
    return arr;
}

插入排序

插入排序的基本思想是將一個記錄(數(shù))插入到已排好序的有序數(shù)列中的適當位置。插入排序的代碼實現(xiàn)如下:

function insertSort(arr) {
    for (var i = 1; i < arr.length; i++) {
        var key = arr[i];
        for (var j = i-1; j >= 0; j--) {
            if (arr[j] > key) {
                arr[j + 1] = arr[j];
            } else {
                arr[j + 1] = key;
            }
        }
    }
    return arr;
}

希爾排序

希爾排序又稱“縮小增量排序”,是在直接插入排序算法上進行改進的,它的基本思想是先將整個待排序序列分割成若干子序列,分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序。因為插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時,效率高。
希爾排序的步驟是:首先取一個小于序列長度的整數(shù)d1作為增量,對序列從頭開始把所有距離為d的元素放在同一個分組中,現(xiàn)在各組內進行直接插入排序;然后去第二個增量d2(小于d1),進行同樣的操作,直到增量為1,即對已經(jīng)基本有序的序列進行插入排序。希爾排序代碼實現(xiàn)如下:

function shellSort(arr, dk) {
    for (var d = dk/2; d > 0; d /= 2) {
        for (var j = d; j < n; j++) {
            if (arr[j] < arr[j-d]) {
                var temp = arr[j];
                var k = j - d;
                while (k >= 0 && arr[k] > temp) {
                    arr[k + d] = arr[k];
                    k -= d;
                }
                arr[k + d] = temp;
            }
        }
    }
}

快速排序

快速排序是一種分而治之的算法,它是冒泡排序的改進,基本思想是通過一趟排序將待排序列分割成獨立的兩部分,其中一部分的值都要比另一部分的值小,再分別對這兩部分繼續(xù)進行排序,直到整個序列有序。
快速排序的步驟是:首先從序列中選擇一個基準元素,假設為第一個元素,將列表分成兩部分,將所有小于基準值的元素放在基準值前面,所有大于基準值的元素放在基準值后面,再分別對這兩部分重復上面的步驟即可。代碼首先如下:

//key為基準值序號
function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        var low = [];
        var high = [];
        var pivotkey = arr[0];
        for (var i = 1; i < arr.length; i++) {
            if (arr[i] <= pivotkey) {
                low.push(arr[i]);
            } else {
                high.push(arr[i]);
            }
        }
    }
    return quickSort(low).concat(pivotkey, quickSort(high));
}

歸并排序

歸并的含義是將兩個或兩個以上的有序表組合成一個新的有序表。假設初始序列長度為n,首先,每個子序列的長度為1,然后前后兩兩歸并。得到若干個長度為2或者1的子序列,再兩兩歸并,如此重復,直至得到一個長度為n的的有序序列為止。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,299評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,823評論 0 15
  • 在算法中,排序的方法有很多種,大致可以分為五類,八種。插入排序分為:希爾排序,直接插入排序;選擇排序:簡單選擇...
    小熊貓貓閱讀 916評論 6 16
  • 概述排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,371評論 0 35
  • 兩個月。六十天。已經(jīng)六十天了。居然才六十天。 六十天是多久? 覆在河流上的油膩植物已經(jīng)消失,灰白刺眼的天空有了藍色...
    寐耳閱讀 565評論 0 0

友情鏈接更多精彩內容