帮手
const defaultComparator = (a, b) => {
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
};
排序函数
const quickSort = (
unsortedArray,
comparator = defaultComparator
) => {
// Create a sortable array to return.
const sortedArray = [ ...unsortedArray ];
// Recursively sort sub-arrays.
const recursiveSort = (start, end) => {
// If this sub-array is empty, it's sorted.
if (end - start < 1) {
return;
}
const pivotValue = sortedArray[end];
let splitIndex = start;
for (let i = start; i < end; i++) {
const sort = comparator(sortedArray[i], pivotValue);
// This value is less than the pivot value.
if (sort === -1) {
// If the element just to the right of the split index,
// isn't this element, swap them.
if (splitIndex !== i) {
const temp = sortedArray[splitIndex];
sortedArray[splitIndex] = sortedArray[i];
sortedArray[i] = temp;
}
// Move the split index to the right by one,
// denoting an increase in the less-than sub-array size.
splitIndex++;
}
// Leave values that are greater than or equal to
// the pivot value where they are.
}
// Move the pivot value to between the split.
sortedArray[end] = sortedArray[splitIndex];
sortedArray[splitIndex] = pivotValue;
// Recursively sort the less-than and greater-than arrays.
recursiveSort(start, splitIndex - 1);
recursiveSort(splitIndex + 1, end);
};
// Sort the entire array.
recursiveSort(0, unsortedArray.length - 1);
return sortedArray;
};
因此,我花了一段时间来弄清楚splitindex
是如何工作的。它从0开始,只有当for循环中的当前元素小于数据透视时,它才会增加1。当我们遇到一个大于pivot值的数字时,splitIndex将保持其值,i
将递增。在下一步中,如果该数字也小于枢轴,我们交换它们
// If the element just to the right of the split index,
// isn't this element, swap them.
谢谢
splitindex
变量跟踪(在当前排序的数组的节中)比透视“小”和“等于或大于”的元素之间的分隔符。你对它工作原理的描述似乎基本正确。
通常,如果我们遇到一个比pivot小的元素,我们将其与splitindex
处的元素交换,将其放入“small than pivot”部分,然后递增splitindex
以指示该部分已增长。如果我们遇到一个相等或更大的,我们就把它留在原地,不增长截面。
假设splitindex
处的元素不小于透视,这就有意义了。如果i
大于splitindex
则是这样,因为我们已经遇到了至少一个这样的元素,并跳过了它。
例外情况是,我们当前正在检查splitindex
处的元素(只要所有元素到目前为止都小于pivot就会出现这种情况)。在这种情况下,我们会将元素与其本身进行交换。这是多余的,所以这就是splitindex!==i
检查的原因。
至于
// If the element just to the right of the split index,
// isn't this element, swap them.
我怀疑作者在评论中犯了一个错误。它应该说“拆分索引处的元素”,而不是“拆分索引右边的元素”。
本文向大家介绍JS排序之快速排序详解,包括了JS排序之快速排序详解的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了JS快速排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置 --JS快速排序--
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两
1. 前言 本节内容是排序算法系列之一:快速排序,主要讲解了快速排序的主体思路,选取了一个待排序的数字列表对快速排序算法进行了演示,给出了快速排序算法的 Java 代码实现,帮助大家可以更好地理解快速排序算法。 2. 什么是快速排序? 快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法,应用分治思想进行排序。 快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快
js中如何实现快速排序?guolguul都不会放
5.12.快速排序 快速排序使用分而治之来获得与归并排序相同的优点,而不使用额外的存储。然而,作为权衡,有可能列表不能被分成两半。当这种情况发生时,我们将看到性能降低。 快速排序首先选择一个值,该值称为 枢轴值。虽然有很多不同的方法来选择枢轴值,我们将使用列表中的第一项。枢轴值的作用是帮助拆分列表。枢轴值属于最终排序列表(通常称为拆分点)的实际位置,将用于将列表划分为快速排序的后续调用。 Figu
最新的博客地址:我的最新博客 定义 快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 n 个项目要 O(nlogn) 次比较。在最坏状况下则需要 O(n^2) 次比较,但这种状况并不常见。事实上,快速排序 (nlogn) 通常明显比其他算法更快,因为它的内部循环(inner l