1. 程式人生 > >數據結構與算法-快速排序

數據結構與算法-快速排序

相同 color 相對 開始 位置 遇到 any urn 算法

快速排序

在待排序數組中,首先任意選取一個數據作為關鍵數據(通常取第一個或中間一個),然後將所有比它小的數都放到它左邊,所有比它大的數都放到它右邊,這個過程稱為一趟快速排序。再遞歸直到結束排序。

從j開始向前搜索(j--),遇到小於key的就將array[j]與array[i]交換;從i往後搜索(i++),遇到大於key的就將array[i]與array[j]交換;再遞歸。

快速排序是不穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。

舉個栗子:

將第一個數字作為關鍵數據 key=6;

6  2  7  3  8  9  此時i=0;j=5;

3  2  7  6

  8  9  此時i=0;j=3;

3  2  6  7  8  9  此時i=2;j=3;

3  2  6  7  8  9  此時i=j=2;第一次循環結束

function quickSort(array){
    function sort(prev, numsize){
        var i = prev;
        var j = numsize -1;
        var key = array[prev];
        if ((numsize - prev) > 1) {
            while(i < j){
                
for(; i < j; j--){ if (array[j] < key) { array[i++] = array[j]; //a[i] = a[j]; i += 1; break; }; } for( ; i < j; i++){ if (array[i] > key){ array[j
--] = array[i]; break; } } } array[i] = key; sort(0, i); sort(i + 1, numsize); } } sort(0, array.length); return array; }

另外還有一種簡單易懂的方法:

設置兩個空數組left和right,將整個數組進行遍歷,遇到小於關鍵數據的就push進left,否則放進right。此處以中間數作為關鍵數據更好理解。

function quickSort(arr){

    if(arr.length <= 1){
        return arr;
    }
    var pivotIndex = Math.floor(arr.length/2); //取中間的為基準
    var pivot = arr.splice(pivotIndex, 1)[0];  //將基準取出並從原數組刪除
    var left = [];
    var right = [];
    for(var i = 0;i < arr.length;i++){
        if(arr[i] < pivot){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }

    return quickSort(left).concat([pivot],quickSort(right));
}

數據結構與算法-快速排序