JavaScript快速排序
我已经在网上浏览了一段时间,我想知道是否有一个“稳定的”快速排序的实际实现是普遍使用的?我可以自己写,但为什么要重新发明轮子JavaScript快速排序,javascript,quicksort,Javascript,Quicksort,我已经在网上浏览了一段时间,我想知道是否有一个“稳定的”快速排序的实际实现是普遍使用的?我可以自己写,但为什么要重新发明轮子 将对象放入数组中 打电话。非常快 var array = [3,7,2,8,2,782,7,29,1,3,0,34]; array.sort(); console.log(array); // prints [0, 1, 2, 2, 29, 3, 3, 34, 7, 7, 782, 8] 为什么按字典顺序打印?默认情况下,array.sort()就是这样工作的,例如,
var array = [3,7,2,8,2,782,7,29,1,3,0,34];
array.sort();
console.log(array); // prints [0, 1, 2, 2, 29, 3, 3, 34, 7, 7, 782, 8]
array.sort()
就是这样工作的,例如,如果您不提供比较器函数,。我们来解决这个问题
var array = [3,7,2,8,2,782,7,29,1,3,0,34];
array.sort(function (a, b)
{
return a-b;
});
console.log(array); // prints [0, 1, 2, 2, 3, 3, 7, 7, 8, 29, 34, 782]
您可以使用装饰排序取消装饰模式轻松“稳定”不稳定的排序
function stableSort(v, f)
{
if (f === undefined) {
f = function(a, b) {
a = ""+a; b = ""+b;
return a < b ? -1 : (a > b ? 1 : 0);
}
}
var dv = [];
for (var i=0; i<v.length; i++) {
dv[i] = [v[i], i];
}
dv.sort(function(a, b){
return f(a[0], b[0]) || (a[1] - b[1]);
});
for (var i=0; i<v.length; i++) {
v[i] = dv[i][0];
}
}
功能稳定端口(v,f)
{
如果(f==未定义){
f=函数(a,b){
a=“”+a;b=“”+b;
返回ab-1:0);
}
}
var-dv=[];
对于(var i=0;i,在这个博客中指出
Array.sort在快速排序或内部合并排序中实现
快速排序通常被认为是高效和快速的,也是如此
V8将其用作数组上的Array.prototype.sort()的实现
超过23项。对于少于23项,V8使用插入
排序[2]。合并排序是quicksort的竞争对手,因为它也是
高效、快速,但具有稳定的附加好处。这是
为什么Mozilla和Safari使用它来实现
Array.prototype.sort()
当使用Array.sort时,在Chrome中应该返回-1 0 1,而不是true或false
arr.sort(function(a,b){
return a<b;
});
// maybe--> [21, 0, 3, 11, 4, 5, 6, 7, 8, 9, 10, 1, 2, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22]
arr.sort(function(a,b){
return a > b ? -1 : a < b ? 1 : 0;
});
// --> [22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
arr.sort(函数(a,b){
返回[21,0,3,11,4,5,6,7,8,9,10,1,2,12,13,14,15,16,17,18,19,20,22]
arr.sort(函数(a,b){
返回a>b-1:a [22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
var数组=[8,2,5,7,4,3,12,6,19,11,10,13,9];
快速排序(数组,0,array.length-1);
document.write(数组);
函数快速排序(arr、左、右)
{
var i=左;
var j=右;
var-tmp;
pivotidx=(左+右)/2;
var pivot=parseInt(arr[pivotidx.toFixed());
/*分割*/
而(我)
j--;
如果(i此算法的工作速度几乎与默认实现一样快
在chrome中使用Array.prototype.sort
function quickSort(t){
_quickSort(t,0,t.length-1,0,t.length-1);
}
function _quickSort(t, s, e, sp, ep){
if( s>=e ) return;
while( sp<ep && t[sp]<t[e] ) sp++;
if( sp==e )
_quickSort(t,s,e-1,s,e-1);
else{
while(t[ep]>=t[e] && sp<ep ) ep--;
if( sp==ep ){
var temp = t[sp];
t[sp] = t[e];
t[e] = temp;
if( s!=sp ){
_quickSort(t,s,sp-1,s,sp-1);
}
_quickSort(t,sp+1,e,sp+1,e);
}else{
var temp = t[sp];
t[sp] = t[ep];
t[ep] = temp;
_quickSort(t,s,e,sp+1,ep);
}
}
}
函数快速排序(t){
_快速排序(t,0,t.length-1,0,t.length-1);
}
函数_快速排序(t,s,e,sp,ep){
如果(s>=e)返回;
而(sp快速排序(递归)
函数快速排序(数组){
if(array.length)是等效函数
为了庆祝功能性Javascript,它似乎是
目前,特别是考虑到ES6+奇妙的语法糖添加。箭头函数和解构我提出了一个非常干净、简短的功能等价物快速排序函数。我没有测试它的性能,也没有将它与内置的快速排序函数进行比较,但它可能会帮助那些努力理解实际的u快速排序的se。鉴于其声明性质,很容易看到发生了什么,而不是它是如何工作的
这是一个没有注释的JSBin版本
函数quickSortF(arr){
//基本情况
如果(!arr.length)返回[]
//这是一个ES6添加,它使用解构来拉出
//第一个值和其他值,类似于其他函数式语言
//比如Haskell,Scala,你可以这样做
//正常以下
常数[头,…尾]=arr,
//在这里,我们使用箭头函数,并充分利用
//简洁语法的优势,详细版本的
//函数(e)=>{returnee<头部),
右=尾部。过滤器(e=>e>=头部)
//这是“分而治之”的征服部分
//递归地遍历每个左数组和右数组
//直到我们到达返回空值的if条件
//数组。这些结果都使用concat连接,
//我们得到了我们的排序数组。
返回quickSortF(左)。concat(头部,quickSortF(右))
}
常数q7=快速排序([11,8,14,3,6,2,7])
//[2, 3, 6, 7, 8, 11, 14]
常数q8=快速排序([11,8,14,3,6,2,1,7])
//[1, 2, 3, 6, 7, 8, 11, 14]
常量q9=快速排序([16,11,9,7,6,5,3,2])
//[2, 3, 5, 6, 7, 9, 11, 16]
控制台日志(q7、q8、q9)
如果已经不清楚发生了什么,注释应该提供足够的信息。实际代码非常短,没有注释,您可能已经注意到我不喜欢分号。又是一个快速排序演示,它以数组的中间部分为轴心,没有具体原因
const QuickSort = function (A, start, end) {
//
if (start >= end) {
return;
}
// return index of the pivot
var pIndex = Partition(A, start, end);
// partition left side
QuickSort(A, start, pIndex - 1);
// partition right side
QuickSort(A, pIndex + 1, end);
}
const Partition = function (A, start, end) {
if (A.length > 1 == false) {
return 0;
}
let pivotIndex = Math.ceil((start + end) / 2);
let pivotValue = A[pivotIndex];
for (var i = 0; i < A.length; i++) {
var leftValue = A[i];
//
if (i < pivotIndex) {
if (leftValue > pivotValue) {
A[pivotIndex] = leftValue;
A[i] = pivotValue;
pivotIndex = i;
}
}
else if (i > pivotIndex) {
if (leftValue < pivotValue) {
A[pivotIndex] = leftValue;
A[i] = pivotValue;
pivotIndex = i;
}
}
}
return pivotIndex;
}
const QuickSortTest = function () {
const arrTest = [3, 5, 6, 22, 7, 1, 8, 9];
QuickSort(arrTest, 0, arrTest.length - 1);
console.log("arrTest", arrTest);
}
//
QuickSortTest();
const QuickSort=函数(A、开始、结束){
//
如果(开始>=结束){
返回;
}
//枢轴的返回索引
var pIndex=分区(A,开始,结束);
//隔板左侧
快速排序(A,开始,pIndex-1);
//右侧隔板
快速排序(A,pIndex+1,结束);
}
常量分区=函数(A、开始、结束){
如果(A.length>1==false){
返回0;
}
让pivotIndex=Math.ceil((开始+结束)/2);
设pivotValue=A[pivotIndex];
对于(变量i=0;ipivotValue){
[pivotIndex]=左值;
A[i]=数据透视值;
数据透视指数=i;
}
}
else if(i>数据透视索引){
如果(leftValueconst QuickSort = function (A, start, end) {
//
if (start >= end) {
return;
}
// return index of the pivot
var pIndex = Partition(A, start, end);
// partition left side
QuickSort(A, start, pIndex - 1);
// partition right side
QuickSort(A, pIndex + 1, end);
}
const Partition = function (A, start, end) {
if (A.length > 1 == false) {
return 0;
}
let pivotIndex = Math.ceil((start + end) / 2);
let pivotValue = A[pivotIndex];
for (var i = 0; i < A.length; i++) {
var leftValue = A[i];
//
if (i < pivotIndex) {
if (leftValue > pivotValue) {
A[pivotIndex] = leftValue;
A[i] = pivotValue;
pivotIndex = i;
}
}
else if (i > pivotIndex) {
if (leftValue < pivotValue) {
A[pivotIndex] = leftValue;
A[i] = pivotValue;
pivotIndex = i;
}
}
}
return pivotIndex;
}
const QuickSortTest = function () {
const arrTest = [3, 5, 6, 22, 7, 1, 8, 9];
QuickSort(arrTest, 0, arrTest.length - 1);
console.log("arrTest", arrTest);
}
//
QuickSortTest();
smaller = (a, list) => list.filter(x => x <= a)
larger = (a, list) => list.filter(x => x > a)
qsort = ([x, ...list]) => (!isNaN(x))
? [...qsort(smaller(x, list)), x, ...qsort(larger(x, list))]
: []
function typeCheck(a, b){
if(typeof a === typeof b){
return true;
}else{
return false;
}
}
function qSort(arr){
if(arr.length === 0){
return [];
}
var leftArr = [];
var rightArr = [];
var pivot = arr[0];
for(var i = 1; i < arr.length; i++){
if(typeCheck(arr[i], parseInt(0))){
if(arr[i] < pivot){
leftArr.push(arr[i]);
}else { rightArr.push(arr[i]) }
}else{
throw new Error("All must be integers");
}
}
return qSort(leftArr).concat(pivot, qSort(rightArr));
}
var test = [];
for(var i = 0; i < 10; i++){
test[i] = Math.floor(Math.random() * 100 + 2);
}
console.log(test);
console.log(qSort(test));
function quickSort(arr) {
if (arr.length < 2) {
return arr;
}
const pivot = arr[Math.floor(Math.random() * arr.length)];
let left = [];
let right = [];
let equal = [];
for (let val of arr) {
if (val < pivot) {
left.push(val);
} else if (val > pivot) {
right.push(val);
} else {
equal.push(val);
}
}
return [
...quickSort(left),
...equal,
...quickSort(right)
];
}
function swap(arr,a,b){
let temp = arr[a]
arr[a] = arr[b]
arr[b] = temp
return 1
}
function qS(arr, first, last){
if(first > last) return
let p = first
for(let i = p; i < last; i++)
if(arr[i] < arr[last])
p += swap(arr, i, p)
swap(arr, p, last)
qS(arr, first, p - 1)
qS(arr, p + 1, last)
}
const quicksort = (arr, comp, iArr = arr) => {
if (arr.length < 2) {
return arr;
}
const isInitial = arr.length === iArr.length;
const arrIndexes = isInitial ? Object.keys(arr) : arr;
const compF = typeof comp === 'function'
? comp : (left, right) => left < right ? -1 : right < left ? 1 : 0;
const [pivotIndex, ...indexesSansPivot] = arrIndexes;
const indexSortReducer = isLeftOfPivot => [
(acc, index) => isLeftOfPivot === (compF(iArr[index], iArr[pivotIndex]) === -1)
? acc.concat(index) : acc,
[]
];
const ret = quicksort(indexesSansPivot.reduce(...indexSortReducer(true)), compF, iArr)
.concat(pivotIndex)
.concat(quicksort(indexesSansPivot.reduce(...indexSortReducer(false)), compF, iArr));
return isInitial ? ret.reduce((acc, index) => acc.concat([arr[index]]), []) : ret;
};
quickSort = (array, left, right) => {
if (left >= right) {
return;
}
const pivot = array[Math.trunc((left + right) / 2)];
const index = partition(array, left, right, pivot);
quickSort(array, left, index - 1);
quickSort(array, index, right);
}
partition = (array, left, right, pivot) => {
while (left <= right) {
while (array[left] < pivot) {
left++;
}
while (array[right] > pivot) {
right--;
}
if (left <= right) {
swap(array, left, right);
left++;
right--;
}
}
return left;
}
swap = (array, left, right) => {
let temp = array[left];
array[left] = array[right];
array[right] = temp;
}
let array = [1, 5, 2, 3, 5, 766, 64, 7678, 21, 567];
quickSort(array, 0, array.length - 1);
console.log('final Array: ', array);
let QuickSort = (arr, low, high) => {
if (low < high) {
p = Partition(arr, low, high);
QuickSort(arr, low, p - 1);
QuickSort(arr, p + 1, high);
}
return arr.A;
}
let Partition = (arr, low, high) => {
let pivot = arr.A[high];
let i = low;
for (let j = low; j <= high; j++) {
if (arr.A[j] < pivot) {
[arr.A[i], arr.A[j]] = [arr.A[j], arr.A[i]];
i++;
}
}
[arr.A[i], arr.A[high]] = [arr.A[high], arr.A[i]];
return i;
}
let arr = { A/* POINTER */: [33, 22, 88, 23, 45, 0, 44, 11] };
let res = QuickSort(arr, 0, arr.A.length - 1);
console.log(res);
let Partition = (arr, low, high) => {
let pivot = arr.A[high];
let index = arr.I[high];
let i = low;
for (let j = low; j <= high; j++) {
if (arr.A[j] + (arr.I[j] * influencer) < pivot + (index * influencer)) {
[arr.A[i], arr.A[j]] = [arr.A[j], arr.A[i]];
[arr.I[i], arr.I[j]] = [arr.I[j], arr.I[i]];
i++;
}
}
[arr.A[i], arr.A[high]] = [arr.A[high], arr.A[i]];
[arr.I[i], arr.I[high]] = [arr.I[high], arr.I[i]];
return i;
}
let influencer = 0.0000001;
let arr = {
I/* INDEXES */: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
A/* POINTER */: [33, 22, 88, 33, 23, 45, 33, 89, 44, 11]
};
let res = QuickSort(arr, 0, arr.A.length - 1);
console.log(res);
I: [19, 11, 14, 10, 13, 16, 18, 15, 12, 17],
A: [11, 22, 23, 33, 33, 33, 44, 45, 88, 89]