如何在不使用排序方法(排序)或排序算法(冒泡排序、快速排序)的情况下对两个已排序的数组进行排序
How to sort two sorted arrays without using sort methods (sort) nor sort algorithms (bubble sort, quick sort)
我在面试中被问到,我的回答与此类似,由于最终循环而导致错误。
const newSortArrays = (arr1, arr2) => {
let output = [];
while (arr1.length && arr2.length) {
if (arr1[0] < arr2[0])
output.push(arr1[0] < arr2[0] ? arr1.shift() : arr2.shift())
}
return [...output, ...arr1, ...arr2]
}
您所说的“排序”两个本身已经排序的数组称为 merge。这就是你的做法:
function merge( left = [] , right = [] ) {
const merged = new Array( left.length + right.length );
let i = 0 ;
let j = 0 ;
let k = 0 ;
// while both lists have items
while ( i < left.length && j < right.length ) {
const x = left[i];
const y = right[j];
if ( x <= y ) {
merged[k++] = x;
++i;
} else {
merged[k++] = y;
++j;
}
}
// if the left list still has items, take them
while ( i < left.length ) {
merged[k++] = left[ i++ ];
}
// if the right list still has items, take them
while ( j < right.length ) {
merged[k++] = right[ j++ ];
}
return merged;
}
一种(效率较低的)单循环变体:
// While some list is not empty
while ( i < left.length || j < right.length ) {
if ( i < left.length && ( j >= right.length || left[i] < right[j] ) ) {
merged[k++] = left[i];
++i;
} else {
merged[k++] = right[j];
++j;
}
}
我在面试中被问到,我的回答与此类似,由于最终循环而导致错误。
const newSortArrays = (arr1, arr2) => {
let output = [];
while (arr1.length && arr2.length) {
if (arr1[0] < arr2[0])
output.push(arr1[0] < arr2[0] ? arr1.shift() : arr2.shift())
}
return [...output, ...arr1, ...arr2]
}
您所说的“排序”两个本身已经排序的数组称为 merge。这就是你的做法:
function merge( left = [] , right = [] ) {
const merged = new Array( left.length + right.length );
let i = 0 ;
let j = 0 ;
let k = 0 ;
// while both lists have items
while ( i < left.length && j < right.length ) {
const x = left[i];
const y = right[j];
if ( x <= y ) {
merged[k++] = x;
++i;
} else {
merged[k++] = y;
++j;
}
}
// if the left list still has items, take them
while ( i < left.length ) {
merged[k++] = left[ i++ ];
}
// if the right list still has items, take them
while ( j < right.length ) {
merged[k++] = right[ j++ ];
}
return merged;
}
一种(效率较低的)单循环变体:
// While some list is not empty
while ( i < left.length || j < right.length ) {
if ( i < left.length && ( j >= right.length || left[i] < right[j] ) ) {
merged[k++] = left[i];
++i;
} else {
merged[k++] = right[j];
++j;
}
}