排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。
目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。
"快速排序"的思想很简单,整个排序过程只需要三步:
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其进行快速排序呢?
第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)
第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。
第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
下面参照网上的资料(这里和这里),用Javascript语言实现上面的算法
方法一:
/*
* @Author: pzx
* @Date: 2022-07-25 15:57:17
* @LastEditors: pzx
* @LastEditTime: 2022-07-25 18:24:44
* @Description: 快速排序
*/
let quickSort =arr =>{
//检查数组个数 小于等于1 返回
if(arr.length<2){
return arr;
}
//选取基准 pivot
let pivotIndex = Math.floor(arr.length/2);
//arr.splice(pivotIndex,1) 即删除arr中的基准元素 并返回删除的元素(基准元素不需要比较)
//arr.splice(pivotIndex,1)[0] 拿到删除的pivot元素
let pivot=arr.splice(pivotIndex,1)[0]
//定义两个空数组 存放一左一右两个子集
let left=[],right=[];
//遍历数组 小于基准的元素放在left 大于基准的元素放在right里
for(let 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));
}
// 功能测试
const arr=[12,45,3,6,8]
const res=quickSort(arr);
console.info(res);//输出[ 3, 6, 8, 12, 45 ]
方法二:
let quickSort = (array, left, right) => {
if (Array.isArray(array) && typeof left === 'number' && typeof right === 'number') {
if (left < right) {
let x = array[right], i = left - 1, temp;
for (let j = left; j <= right; j++) {
if (array[j] <= x) {
i++;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
return array;
} else {
return 'array is not an Array or left or right is not a number!';
}
}
思路都是一样的,首先选取基准pivot ,将小于pivot元素放到pivot左边,大于pivot元素放到pivot右边,对左子列、右子列分别重复上述操作直到所有子列长度为1 快速排序完成~
算法分析
- 最佳情况:
T(n) = O(nlogn)
,快速排序最优的情况就是每一次取到的元素都刚好平分整个数组 - 最差情况:
T(n) = O(n²)
,最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序) - 平均情况:
T(n) = O(nlogn)
- 稳定性:
不稳定