原理
(1)從一個(gè)數(shù)列中選出一個(gè)「基準(zhǔn)」
(2)然后遍歷所有元素,把所有比這個(gè)「基準(zhǔn)」小的元素放在「基準(zhǔn)」的左邊,所有比「基準(zhǔn)」大的元素放在「基準(zhǔn)」的右邊,如果與「基準(zhǔn)」相等,隨意放哪邊。一輪分區(qū)下來(lái),這樣會(huì)是該「基礎(chǔ)」處于整個(gè)數(shù)列的中間位置。
(3)遞歸地,把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。
(4)遞歸到最底部時(shí),數(shù)列的長(zhǎng)度只有0或者1,即本身就是排好序的。這個(gè)算法一定會(huì)結(jié)束,因?yàn)樵诿看蔚牡?,它至少?huì)把一個(gè)元素?cái)[到它最后的位置去。代碼
function quickSort(arr) {
function __quickSort__(arr, start, end) {
if(start >= end) return;
let key = arr[end];
let left = start;
let right = end - 1;
while(left < right){
while( arr[left] < key && left < right) left++;
while( arr[right] > key && left < right) right--;
[arr[left], arr[right]] = [arr[right], arr[left]];
}
if(arr[left] >= key) {
[arr[left], arr[end]] = [arr[end], arr[left]];
} else {
left++;
}
__quickSort__(arr, start, left - 1);
__quickSort__(arr, left + 1, end);
}
__quickSort__(arr, 0, arr.length - 1 );
return arr;
}
- 本代碼,以最后一個(gè)數(shù)為「基準(zhǔn)」(key值)
- 從數(shù)列首位開(kāi)始遍歷,如果遇到比key小的數(shù),則繼續(xù)向后掃描,直到遇到比key值大的元素,然后從key值前一個(gè)元素開(kāi)始從后向前掃描,直到遇到比key值小的元素
- 此時(shí)交換位置停止的兩個(gè)元素
- 繼續(xù)上面的邏輯
- 直到left和right相遇
- 如果相遇時(shí)的值大于或者等于key值,則把該相遇的值與key值互換位置
- 如果相遇時(shí)的值小于key值,則把left后移一位。