简介
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行
-
1.首先设定一个分界值,通过该分界值将数组分成左右两部分。
-
2.将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
-
3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
-
4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
let quickTopK = function (arr, k) {
if(k==0)return []
if (arr.length < 2) return arr
let midValue = arr.splice(0, 1), left = [], right = []
arr.forEach((el) => {
el > midValue ? left.push(el) : right.push(el)
});
if (left.length == k) {
return left
} else if (left.length > k) {
return quickTopK(left, k)
} else {
return left.concat(midValue, quickTopK(right, k - left.length - 1))
}
}
console.log(quickTopK([6, 0, 1, 4, 9, 7, -3, 1, -4, -8, 4, -7, -3, 3, 2, -3, 9, 5, -4, 0], 8))
[ 9, 7, 9, 6, 5, 4, 4, 3]