//快排使用分治的思想,将一个复杂问题,分为多个相似的子问题,不断分,直到更小的问题可以简单求解。
// 快排步骤:
// 1.选基准数
// 2.将大于基准的数放在右边,小于基准的数放在左边
// 创建指针left,指针right,指针left遇到大数,指针right遇到小数,两者交换
// 3.重复上述操作,直到数组完全排序
let quickSort = (arr) => {
quick(arr, 0 , arr.length - 1)
}
let quick=(arr,left,right)=>{
let index
if(left<right){
index=partition(arr,left,right)
if(left<index-1)
quick(arr,left,index-1)
if(index<right)
quick(arr,index,right)
}
}
let partition=(arr,left,right)=>{
// 取中间项为基准
var datum = arr[Math.floor(Math.random() * (right - left + 1)) + left],
i = left,
j = right
// 开始调整
while(i <= j) {
// 左指针右移
while(arr[i] < datum) {
i++
}
// 右指针左移
while(arr[j] > datum) {
j--
}
// 交换
if(i <= j) {
swap(arr, i, j)
i += 1
j -= 1
}
}
return i
}
//交换函数
let swap=(arr,i,j) =>{
let temp=arr[i]
arr[i]=arr[j]
arr[j]=temp
}
// 测试
let arr = [1, 3, 2, 5, 4]
quickSort(arr)
console.log(arr) // [1, 2, 3, 4, 5]
// 第 2 个最大值
console.log(arr[arr.length - 2]) // 4
时间复杂度比较复杂,最好的情况是O(N),最差的时候是O(N^2),所以平时说的O(N*logN)为其平均时间复杂度。