數據結構與算法-快速排序
阿新 • • 發佈:2017-11-28
相同 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)); }
數據結構與算法-快速排序