-
Notifications
You must be signed in to change notification settings - Fork 634
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
腾讯&字节&阿里:介绍一下快排原理以及时间复杂度,并实现一个快排 #70
Comments
快排的原理是基于二分法的思想,时间复杂度比较复杂,最好的情况是O(N),最差的时候是O(N^2),所以平时说的O(N*logN)为其平均时间复杂度。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
}; |
这个比作者写的好,简单,容易理解。 嗯,作者你这个为啥要写这么复杂呢,理解起来也很难 |
应该也算好理解吧 function quickSortRecursion(arr) {
if (!arr || arr.length < 2) return arr;
const pivot = arr.pop();
let left = arr.filter((item) => item < pivot);
let right = arr.filter((item) => item >= pivot);
return [...quickSortRecursion(left), pivot, ...quickSortRecursion(right)];
} |
快排,什么时候是最好情况,时间复杂度为O(n)呢? |
这个需要不断的新开数组,便于理解,但会有多余的时间和空间消耗,作者的版本是原地排序,没有多余的空间消耗,时间也更短。 |
已经排好序了就是 O(n),完全逆序就会退化到 O(n^2) |
|
快排使用了分治策略的思想,所谓分治,顾名思义,就是分而治之,将一个复杂的问题,分成两个或多个相似的子问题,在把子问题分成更小的子问题,直到更小的子问题可以简单求解,求解子问题,则原问题的解则为子问题解的合并。
快排的过程简单的说只有三步:
partition
)具体按以下步骤实现:
注意这里的基准该如何选择喃?最简单的一种做法是每次都是选择最左边的元素作为基准:
但这对几乎已经有序的序列来说,并不是最好的选择,它将会导致算法的最坏表现。还有一种做法,就是选择中间的数或通过
Math.random()
来随机选取一个数作为基准,下面的代码实现就是以随机数作为基准。代码实现
快排是从小到大排序,所以第
k
个最大值在n-k
位置上复杂度分析
The text was updated successfully, but these errors were encountered: