1. 程式人生 > >JS實現快速排序(QuickSort)

JS實現快速排序(QuickSort)

偶然看到阮一峰老師部落格中幾年前的一個快速排序演算法,每次迴圈一次都要建立兩個額外陣列,如果資料量大的話要佔用不少額外記憶體。但是陣列是引用型別,是可修改的,可以直接操作原陣列本身來節約記憶體。

下面自己寫了一個,當做練手。(除去標準的雙向分類外,還稍稍優化了程式碼,也加了單項優化方法,使其更加簡潔)

快速排序方法的關鍵在於選取一個值,將整個陣列分為兩部分,小的在左,大的在右,下面就是這個函式的寫法:

//該函式的主要目的是交換陣列中兩個元素的位置
function swap(arr, index1, index2) {

    let data = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = arr[index1];

    //陣列是引用型別,允許修改原陣列。
}

//選取隨機值,將陣列分為兩部分
function partition(arr, start, end) {
    let keyIndex = end,
        key = arr[keyIndex]; //將隨機值(以後稱key值)定為最後一個數,也可以真的隨機選取,見下一行
    // let keyIndex = Math.floor(Math.random() * (end - start)) + start;

    let i = start,
        j = end,
        order = true;
    //當order為true時正向篩選,當order為false時逆向篩選
    //先從正向開始,因為我們把key值儲存到了陣列的結尾處。
    while(i != j) {
        if(order) {
            //正向篩選
            if (arr[i]>key) {
                swap(arr, i, j); //將大於key的數字和key進行交換
                order = false;
            } else {
                i++;
            }

        } else {
            //逆向篩選
            if(arr[j]<key) {
                swap(arr, i, j); //將小於key的數字和key進行交換
                order = true;
            } else {
                j--;
            }
        }
    }
    return i;//返回key值最終的位置
}

觀察分組演算法partition不難發現,其實i和j位置上始終有一個存著key值,然後和比它大或者比它小的值進行交換。那麼我們也可以將其寫成一個單向的分組方法:

function partition2(arr, start, end) {
    let keyIndex = end,
        key = arr[end];
    let i = start -1,
        j = start;
    for (;j<end;j++) {
        if (arr[j]< key) {
        // i位置的值永遠比key值小
            i++;
            if (i != j) {
                swap(arr, i, j);
            }
        }
    } 
    ++i;
    swap(arr, i, end);

    return i; //返回key值最終的位置
}

接下來遞迴呼叫分組函式,將整個陣列排序:

function quickSort(arr, start, end) {
    if (start == end) return;
    let index = partition(arr, start, end);
    if (index > start){
        quickSort(arr, start, index-1);
    }
    if (index<end) {
        quickSort(arr, index+1, end);
    }
}

相關推薦

JS實現快速排序(QuickSort)

偶然看到阮一峰老師部落格中幾年前的一個快速排序演算法,每次迴圈一次都要建立兩個額外陣列,如果資料量大的話要佔用不少額外記憶體。但是陣列是引用型別,是可修改的,可以直接操作原陣列本身來節約記憶體。 下面自己寫了一個,當做練手。(除去標準的雙向分類外,還稍稍優化了

js實現快速排序的方法

大小 我們 mage 左右 div () quicksort www for 因為面試面到了這個問題,所以寫一下,加深印象,有兩種方法 第一種是通過兩個for循環,每一次對比相鄰兩個數據的大小,小的排在前面,如果前面的數據比後面的大就交換這兩個數的位置,這個方法就是比較次數

使用JS實現快速排序

中間 math 遍歷 ice 大致 spl arr [0 遞歸 大致分三步: 1、找基準(一般是以中間項為基準) 2、遍歷數組,小於基準的放在left,大於基準的放在right 3、遞歸 function quickSort(arr){ /

js實現快速排序,二分查詢 (詳解,一次學會)

js中幾大演算法,最近看到網上各路大神的解答,都蠻好的,自己也來玩一玩 一,快速排序 大致分三步: 在資料集之中,選擇一個元素作為"基準"(pivot)。 所有小於"基準"的元素,都移到"基準"的左邊;所有大於"基準"的元素,都移到"基準"的右邊。 對"基準"左邊和右邊的兩個子集,不斷重複

Java程式碼實現快速排序(QuickSort)

Java程式碼實現快速排序(QuickSort) 核心思想 如果要排序陣列中下標從p到r之間的一組資料,我們選擇p到r之間的任意一個數據為pivot(分割槽點)。 我們遍歷p到r之間的資料,將小於pivot的放到左邊,將大於pivot的放到右邊,將pivot放到中間。經過這一

JS實現快速排序

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8">

用Python實現快速排序(Quicksort)演算法

1.快速排序(Quicksort)演算法介紹 快速排序(Quicksort)是對氣泡排序的一種改進,但是不是穩定的排序演算法 2.演算法思想 1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1; 2)以第一個陣列元素作為關鍵資料,儲存在key中,即key=

JS實現快速排序(2種方法)

1、用i和j兩個指標 2、用一個指標判斷,大的放在右邊,小的數放在左邊 <!DOCTYPE html> <html> <head> <title>quickSort</title> <meta cha

使用C++實現快速排序QuickSort

參考了weiss的《資料結構與演算法分析》的C++描述第三版。 快速排序原理其實很簡單,是一個遞迴的過程。首先確定一個樞紐元,然後把大於樞紐元的元素放在左邊,把小於樞紐元的元素放在右邊。然後再對左右兩邊的子序列不斷的重複這個操作(確定樞紐元,然後把大小元素歸類),直到子序列

快速排序(QuickSort)--php實現

快速排序使用分治策略(Divide and Conquer)來把一個序列分為兩個子序列。 原理: 從序列中挑出一個元素,作為"基準"(pivot) 把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的後面(相同的數可以到任一邊),這個稱為分割槽(partition)操作

一種簡單的用java實現快速排序Quicksort

1,快速排序(Quicksort)是對氣泡排序的一種改進。對資料量越大,資料分佈越混亂的,一般認為是效能最好的。快排是分治思想的一種體現,把大的問題細化成小問題,把小問題細化成更小的問題,最終把問題縮小到一定規模內,可解決。 2,快排演算法思路就是,先取一個數作為關鍵資料(key一般

GO語言quicksort實現.快速排序法程式碼實現

package main import ( "fmt" "math/rand" "time" ) func main() { var z []int for i := 0; i <

js實現氣泡排序快速排序

氣泡排序 1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 3.針對所有

js實現冒泡排序(bubble sort)快速排序(quick sort)歸並排序(merge sort)

mergesort dep lse small sort code n) ble 排序效率 排序問題相信大家都比較熟悉了。用js簡單寫了一下幾種常用的排序實現。其中使用了es6的一些語法,並且不僅限於數字——支持各種類型的數據的排序。那麽直接上代碼: function co

JS實現冒泡排序

turn 實現 fun -i spa con cti for logs 1. 1 var arr = prompt("請輸入一個數組(以“,”隔開):").split(",").map(function(data){ 2 return +data;}); 3

快速排序(quickSort)

str nlogn swap void spa 元素 完成 partition 一個 快速排序是最經典和常用的排序算法了,已經有不計其數的博客0 0 首先介紹下快速排序的原理。快速排序的基礎是基於這樣的事實:在一個序列中,如果一個節點前面的所有元素都不大於它,後面的所有元素

JS實現插入排序法和選擇排序

排序算法 ble inner 基本算法 出了 clas 一點 暫時 while   試著寫了寫,但對輸出方式不太熟,所以註釋部分的沒能成功(我猜測是數據被覆蓋了,所以最後運行結果都是‘6‘),或許不能用innerHTML來進行輸出,暫時不管了,改天再研究研究JavaScri

python-實現快速排序

code urn print lis 退出 快速 turn utf-8 col # encoding=utf-8 def quick_sort(alist, start, end): """快速排序""" if start >= end:

算法中的快速排序 quicksort

wide div 對比 nal optimize rate fse incr mce 快速排序之所以比較快,是因為相比冒泡排序,每次交換是跳躍式的。每次排序的時候設置一個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全 部放到基準點的右邊。這樣在每次

Java實現快速排序

static nlogn -- 可能 超過 highlight uic 數組 images 一、快速排序的思想   基於分治的思想,是冒泡排序的改進型。首先在數組中選擇一個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),然後分別從數組的兩端掃描數組,設兩