mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-31 14:12:37 +08:00
Refine tests for mergeSort
This commit is contained in:
38
utilities/javascript/deepEqual.js
Normal file
38
utilities/javascript/deepEqual.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
function deepEqual(val1, val2) {
|
||||||
|
if (typeof val1 !== typeof val2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Array comparison.
|
||||||
|
if (Array.isArray(val1) && Array.isArray(val2)) {
|
||||||
|
if (val1.length !== val2.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (let i = 0; i < val1.length; i++) {
|
||||||
|
if (!deepEqual(val1[i], val2[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Object comparison.
|
||||||
|
if (typeof val1 === 'object' && typeof val2 === 'object') {
|
||||||
|
const keys1 = Object.keys(val1);
|
||||||
|
const keys2 = Object.keys(val2);
|
||||||
|
if (keys1.length !== keys2.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (let i = 0; i < keys1.length; i++) {
|
||||||
|
if (!deepEqual(val1[keys1[i]], val2[keys2[i]])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Primitive comparison.
|
||||||
|
return val1 === val2;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = deepEqual;
|
@ -1,54 +1,64 @@
|
|||||||
function mergeSort(arr) {
|
function mergeSort(arr) {
|
||||||
if (arr.length < 2) {
|
if (arr.length < 2) {
|
||||||
// Arrays of length 0 or 1 are sorted by definition
|
// Arrays of length 0 or 1 are sorted by definition.
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const left = arr.slice(0, Math.floor(arr.length / 2));
|
const left = arr.slice(0, Math.floor(arr.length / 2));
|
||||||
const right = arr.slice(Math.floor(arr.length / 2), Math.floor(arr.length));
|
const right = arr.slice(Math.floor(arr.length / 2), Math.floor(arr.length));
|
||||||
|
|
||||||
return merge(mergeSort(left), mergeSort(right));
|
return merge(mergeSort(left), mergeSort(right));
|
||||||
}
|
}
|
||||||
|
|
||||||
function merge(arr1, arr2) {
|
function merge(arr1, arr2) {
|
||||||
const merged = [];
|
const merged = [];
|
||||||
|
let i = 0, j = 0;
|
||||||
|
|
||||||
let i = 0;
|
while (i < arr1.length && j < arr2.length) {
|
||||||
let j = 0;
|
if (arr1[i] <= arr2[j]) {
|
||||||
|
merged.push(arr1[i]);
|
||||||
while (i < arr1.length && j < arr2.length) {
|
i++;
|
||||||
if (arr1[i] < arr2[j]) {
|
} else if (arr2[j] < arr1[i]) {
|
||||||
merged.push(arr1[i]);
|
merged.push(arr2[j]);
|
||||||
i++;
|
j++;
|
||||||
} else if (arr2[j] < arr1[i]) {
|
}
|
||||||
merged.push(arr2[j]);
|
|
||||||
j++;
|
|
||||||
} else {
|
|
||||||
merged.push(arr1[i]);
|
|
||||||
i++;
|
|
||||||
j++;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
while (i < arr1.length) {
|
merged.push(...arr1.slice(i), ...arr2.slice(j));
|
||||||
merged.push(arr1[i]);
|
return merged;
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (j < arr2.length) {
|
|
||||||
merged.push(arr2[j]);
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return merged;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const arr1 = [7, 2, 4, 3, 1, 2];
|
const deepEqual = require('./deepEqual');
|
||||||
const arr2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
|
|
||||||
const arr3 = [98322, 3242, 876, -234, 34, 12331];
|
|
||||||
const arr4 = [1, 2, 3, 4, 5, 0];
|
|
||||||
|
|
||||||
console.log(mergeSort(arr1));
|
console.log(deepEqual(
|
||||||
console.log(mergeSort(arr2));
|
mergeSort([]),
|
||||||
console.log(mergeSort(arr3));
|
[],
|
||||||
console.log(mergeSort(arr4));
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([1]),
|
||||||
|
[1],
|
||||||
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([2, 1]),
|
||||||
|
[1, 2],
|
||||||
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([7, 2, 4, 3, 1, 2]),
|
||||||
|
[1, 2, 2, 3, 4, 7],
|
||||||
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([7, 2, 4, 3, 1, 2]),
|
||||||
|
[1, 2, 2, 3, 4, 7],
|
||||||
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]),
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
||||||
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([98322, 3242, 876, -234, 34, 12331]),
|
||||||
|
[-234, 34, 876, 3242, 12331, 98322],
|
||||||
|
));
|
||||||
|
console.log(deepEqual(
|
||||||
|
mergeSort([1, 2, 3, 4, 5, 0]),
|
||||||
|
[0, 1, 2, 3, 4, 5],
|
||||||
|
));
|
||||||
|
Reference in New Issue
Block a user