先看一个问题
设计一个方法,实现小于num的在数组左边,等于num的在中间大于num的在数组右边
function partition(arr,L,R,num) {
let less=L-1;
let more=R+1;
let idx=L;
for(;idx<more;){
if (arr[idx]<num){
swap(arr,++less,idx++);//less先+1再交换,idx先交换再+1
}
else if(arr[idx]>num){
swap(arr,--more,idx);
}
else {
idx++;
}
}
return arr;
}
function swap(arr,i,j) {
let temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
console.log(partition([5,3,5,1,0,4,1,2,6,8,3], 0, 10,4));
三路随机快排
时间复杂度 长期期望是O(N*logN)空间复杂度O(logN)
//小于等于num的在左边,等于num的在中间,大于num的在右边
function partition(arr,L,R) {
let less=L-1;
let more=R+1;
let idx=L;
for(;idx<more;){
if (arr[idx]<arr[R]){
swap(arr,++less,idx++);//less先+1再交换,idx先交换再+1
}
else if(arr[idx]>arr[R]){
swap(arr,--more,idx);
}
else {
idx++;
}
}
return [less+1,more-1];// 相同数的最左边和最右边
}
function swap(arr,i,j) {
let temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
function quickSort(arr,L,R){
if (L<R){
swap(arr,L+Math.floor(Math.random()*(R-L+1)),R);//随机选择一个数字与最后一个数交换作为参照数
let p=partition(arr,L,R);
quickSort(arr,L,p[0]-1);
quickSort(arr,p[1]+1,R);
}
return arr;
}
console.log(quickSort([3,5,7,4,2,7,1,4,6,7,0], 0, 4));