在了解快速排序法的概念之前要先理解partition演算法,不过单用文字叙述还是蛮抽象的,所以搭配示意图来做说明,假如现在有个阵列[2, 6, 3, 9, 1, 5]
取阵列的最後一个值5作为pivot基准值
接下来从index 0开始, 2小於5所以标记为绿色
再来是6,6大於5所以标记为橘色
轮到3,发现比5小所以把3标记为绿色,因为要把比5小的值都集中到左边,所以跟6交换位置
接下来是9, 比5大标记成橘色
轮到1,比5小所以把1标记为绿色,因为比5小的值都要集中到左边,所以要跟6交换位置
最後再让支点5与最大值群组(橘色的便条纸)中的第一个值做交换,5这个数字就完成了排序
不过这时你会发现绿色的阵列并没有由小到大排序好,这边假设我们也不知道橘色阵列是否有排序好, 所以接下来也对左右两个阵列,利用递回的方式持续做一样的动作。
函式内部实作为:
进行完一轮之後,若左群体[比基准值小的阵列]或右群体[比基准值大的阵列]的长度大於1的话,则再次呼叫quickSort函式(递回),最後将[比基准小的阵列] 、基准值、[比基准大的阵列]依序组合起来就是排序好的阵列。
const partition = (arr, left, right) => {
let pivot = arr[right];
//用来计算有几个数字小於pivot
let i = left - 1;
//从最左边找到pivot的前一个停止
for (let j = left; j <= right - 1; j++) {
if (arr[j] <= pivot) {
i++;
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
[arr[i + 1], arr[right]] = [arr[right], arr[i + 1]];
return i + 1;
};
const quickSort = (arr, left, right) => {
if (left < right) {
let sortedIndex = partition(arr, left, right);
quickSort(arr, left, sortedIndex - 1);
quickSort(arr, sortedIndex + 1, right);
}
return arr;
};
const arr = [2, 6, 3, 9, 1, 5];
quickSort(arr, 0, arr.length - 1);
//输出 [1, 2, 3, 5, 6, 9]
第二种解法比较容易理解
函式内部实作为:
若A or B阵列长度大於1,则再次呼叫quickSort函式(递回),最後将[比基准小的阵列] 、基准值、[比基准大的阵列]依序组合起来就是排序过後的阵列。
用js实作第二种快速排序法
const quickSort2 = (arr) => {
if (arr.length <= 1) return arr;
const small = [];
const big = [];
const pivot = arr[arr.length - 1];
for (let i = 0; i < arr.length - 1; i++) {
if (pivot > arr[i]) {
small.push(arr[i]);
} else {
big.push(arr[i]);
}
}
return [...quickSort2(small), pivot, ...quickSort2(big)];
};
const arr1 = [2, 6, 3, 9, 1, 5];
quickSort2(arr1);
//输出 [1, 2, 3, 5, 6, 9]
今天要讲解的内容,在前面讲解theme的应用时,有稍微讲解了一些基本的应用,官方文件内前半部的内容我...
延续上篇所提到的,接着我们要从第三点开始介绍 三res-----------资源目录 今天介绍res...
适用人员: 资安人员/技术人员。 适用法规: 资通安全责任等级分级办法 - 附表十资通系统防护基准....
大家好,我是YIYI,今天我要来制做设定页面。 从哪里可以进入设定页面呢? 点击LIST的设定~如下...
Day 28 Work With Elastic Cloud 前言 昨天我们讲解完了若是希望能够蒐集...