快速排序
2020-03-17 本文已影响0人
mapleLeaf_X
概念
快速排序(quick sort) 是对冒泡排序的一种改进。
快速排序动图.gif原理
通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,使得整个数据变成有序序列。
步骤:
- 首先设定一个分界值,通过该分界值将数据分成两部分。
- 将大于或等于分界值的数据集中到数据右边,小于分界值的数据集中在数组的左边,此时,左边部分的各元素都小于或等于分界值,而右边部分各元素都大于或等于分界值
- 将左右两边部分数据独立重复1和2,达到最后的有序序列。
时间复杂度: 平均时间复杂度为O(nlog2n)
算法稳定性:选定的分界值会前后交换位置,所以快速排序是一个不稳定的排序算法
算法实现
function quickSort(arr) {
// 判断是否是数组,不是则抛出错误
if(!Array.isArray(arr)) {
throw new Error('传入的不是数组')
}
const len = arr.length;
// 判断长度是否小于等于1,是则直接返回
if(len <= 1) {
return arr;
}
const sort = (arr, left = 0, right = len - 1) => {
if(left >= right) { //如果左边的索引大于等于右边的索引说明整理完毕
return
}
let i = left, j = right;
const baseVal = arr[i]; // 取无序数组第一个数为基准值
//把所有比基准值小的数放在左边大的数放在右边
while(i < j) {
//找到一个比基准值小的数交换,j>i一定需要,否则会出现j和i不相等的情况
while(j > i && baseVal <= arr[j]) {
j--;
}
arr[i]=arr[j]; // 将较小的值放在左边如果没有找到比基准值小的数就是将自己赋值给自己(i 等于 j)
//找到一个比基准值大的数交换,j>i一定需要,否则会出现j和i不相等的情况
while(j > i && arr[i] <= baseVal) {
i++
}
arr[j] = arr[i]; // 将较大的值放在右边如果没有比基准值大的数就是将自己赋值给自己(i 等于 j)
}
arr[i] = baseVal; // 将基准值放至中央位置完成一次循环(这时候 j 等于 i )
sort(arr,left, j-1);// 将左边的无序数组重复上面的操作
sort(arr,j+1, right);// 将右边的无序数组重复上面的操作
}
sort(arr)
return arr
}