基本思想:分治法,先在数组中将第一个数设置为key,然后用两个指针(low,high)从两边遍历数组,要求low小于high,low指向值大于等于key则暂停,high指向值小于key则暂停,当两个指针都停下时,如果low指向值小于high指向值,则它们指向的数换位,然后继续遍历,否则比较key与high指向的值,当key小于high指向的值并且high大于key所在的下标的值,那么指针继续左移,直到不满足条件为止,不满足key小于high指向的值并且high大于key所在的下标的值的时候,如果key大于high指向的值,那么它们换位,返回此时high,否则返回key的下标,执行完一次上述过程,数组会被二分,并且左边部分都比key小,右边部分都比key大,这样对两边再进行上述操作,直到排序完成。
function quickSort(arr, first, last){
if (first < last) {
var pivot = getPivot(arr, first, last);
quickSort(arr, first, pivot-1);
quickSort(arr, pivot+1, last);
}
}
function getPivot(arr, first, last){
let point = arr[first];
let low = first + 1;
let high = last;
while(high > low){
while(high >= low && arr[low] <= point){
low++;
}
while(high >= low && arr[high] > point){
high--;
}
if(low < high){
let temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
}
}
while(point <= arr[high] && high > first){
high--;
}
if (point > arr[high]) {
arr[first] = arr[high];
arr[high] = point;
return high;
}else{
return first;
}
}
时间复杂度:O(nlogn);