快速排序是对冒泡排序的一种改进。
通过一趟排序将要排序的数据分割成独立的左右两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,另一部分则相反;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程递归进行。(假设基数为n,比基数小的为left,比基数大的为right;即left,n,right)
快速排序,用到的方式很多;
比如:
1.取第一个作为基数开始顺序进行;
2.取第一个作为基数开始,顺序(数组第一个开始往后找)和逆向进行(数组最后一个往前找);
3.随机取一个作为基数开始。
4.取中间值作为基数开始。
等等。。。
我们看上面动图中可知,我们是取中间的一个数作为基数进行处理,则有如下代码:
function quickSort(arr){
let len = arr.length;
//递归需要有一个出口,即只有一个时就不必再交换位置,为自己本身,此时结束
if (len <= 1){
return arr;
};
let leftArr = [];
let rightArr = [];
let mid = Math.floor(len / 2); // 中间基数
let i = 0;
while (i < len) {
if (i === mid) {
i++;
continue;
};
if (arr[i] < arr[mid]) {
leftArr.push(arr[i])
} else {
rightArr.push(arr[i])
}
i++;
}
return [...quickSort(leftArr), arr[mid], ...quickSort(rightArr)]
}
console.log(quickSort([4,3,5,8,1]));
从上面代码我们可以得知,当初始排序数据随机分布,使每次分成的两个子区间中的元素个数大致相等时,递归树高度为log2n,快速排序呈现最好情况,即最坏情况下的时间复杂度为nlog2n;即时间复杂度为log2n~nlog2n。