如何在Node.js中不使用循环对数组进行排序
在Node.js中,有一个内置的sort()方法可以方便地对数组进行排序。然而,作为初学者,为了了解sort()方法的内部工作原理,用户应该学习各种排序算法。
在本教程中,我们将学习一种在NodeJS中不使用循环对数组进行排序的不同算法。
使用setInterval()方法
setInterval()方法允许我们在每个时间间隔后调用任何特定的函数。此外,我们可以将setInterval()方法的id存储在任何变量中,并在以后使用它来清除时间间隔。
因此,我们可以在setInterval()方法中调用一个回调函数,该回调函数从数组中找到最小的元素,将其推入已排序的数组,并将最小的元素替换为Infinity值。
语法
用户可以按照下面的语法使用setInterval()方法来在NodeJS中不使用循环对数组进行排序。
let interval = setInterval(sort_callback, 2);
// in sort_callback() function
let min_from_array = Math.min.apply(null, array);
sorted_Array.push(min_from_array);
array[array.indexOf(min_from_array)] = Infinity;
if (++len == array.length) {
clearInterval(interval);
}
步骤
步骤1 - 每2秒使用setInterval()方法调用sort_callback()函数
步骤2 - 使用Math.min.apply()方法获取数组的最小元素
步骤3 - 将最小元素推入数组
步骤4 - 使用最小元素的索引,并将最小元素替换为无限大的值
步骤5 - 如果len变量的值等于数组的长度,则意味着所有数组元素都已排序,并使用setInterval()方法清除间隔以停止执行sort_callback()函数
示例
如下示例,我们创建了一个数字数组,并应用上述算法以升序排序数组。用户可以使用Math.max.apply()方法以降序对数组进行排序,并将负无穷大的值分配给最大元素。
let array = [10, 20, 45, 21, 32, 11, 9, 8, 65];
console.log("The original array is");
console.log(array);
let interval = setInterval(sort_callback, 2);
let len = 0;
let sorted_Array = [];
function sort_callback() {
let min_from_array = Math.min.apply(null, array);
sorted_Array.push(min_from_array);
array[array.indexOf(min_from_array)] = Infinity;
len++;
if (len == array.length) {
clearInterval(interval);
console.log("The sorted array is");
console.log(sorted_Array);
}
}
使用array.reduce()方法
在每次array.reduce()方法的迭代中,我们可以不断从数组中提取最小元素,并将其推入sorted_array中。通过这种方式,一旦reduce()方法的执行完成,我们就可以得到排序后的数组。
语法
用户可以按照下面的语法在NodeJS中使用array.reduce()方法对数组进行排序,而不使用循环。
arr.reduce((sorted_Array, element) => {
let min_from_array = Math.min.apply(null, arr);
sorted_Array.push(min_from_array);
arr[arr.indexOf(min_from_array)] = Infinity;
return sorted_Array;
}, []);
在以上语法中,我们从数组中提取最小元素,将其推入数组中,并用无穷大替换最小元素,并从reduce()方法返回排序后的数组。
示例
在下面的示例中,sort_array()函数使用reduce()方法对数组进行排序。完成reduce()方法的迭代后,我们从函数中返回排序后的数组。
let arr = [
100, 99, 32, 45, 6567898, 32, 123, 54, 7, 89, 745, 43, 34, 232, 121, 23, ];
console.log("The original array is " + arr);
function sort_array() {
return arr.reduce((sorted_Array, element) => {
let ind = 0;
let min_from_array = Math.min.apply(null, arr);
sorted_Array.push(min_from_array);
arr[arr.indexOf(min_from_array)] = Infinity;
return sorted_Array;
}, []);
}
console.log("The sorted array is ", sort_array());
用户可以在输出中看到原始数组和排序后数组之间的差异。
使用递归解决方案
在这种方法中,我们将使用递归冒泡排序算法来对数组进行排序。冒泡排序算法使用两个循环来迭代数组,交换元素并对整个数组进行排序。
在这里,我们将用递归解决方案替换外层for循环。
语法
用户可以根据下面的语法实现递归冒泡排序算法。
function recursive_sort(array, index) {
if (index == 1)
return;
var count = 0;
for (var i = 0; i < index - 1; i++)
// swap array elements if it’s not sorted
return recursive_sort(array, index - 1);
}
步骤
步骤1 - 首先编写一个基本情况。如果索引变为1,执行返回语句。
步骤2 - 用0初始化计数变量。
步骤3 - 使用for循环遍历数组,如果两个元素没有排序,则交换它们。当我们交换元素时,将计数的值增加1。
步骤4 - 如果计数的值为0,则不需要再进行交换,并从函数中返回。
步骤5 - 通过将索引值减1并减少一次迭代来进行递归函数调用。
示例
在下面的示例中,我们使用递归冒泡排序函数来在NodeJS中对数组进行排序。我们使用临时变量来交换两个变量。
var arr = [613, 65, 654, 4, 65, 4, 61, 631, 6513, 89, 7, 97, 09, 98];
console.log("The original array is " + arr);
function recursive_sort(array, index) {
// return statement for the base case
if (index == 1) return;
var count = 0;
// swap elements that are not in sorted order
for (var i = 0; i < index - 1; i++)
if (array[i] > array[i + 1]) {
var temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
count++;
}
// if any swap does not occur, execute the return;
if (count == 0) return;
// call recursive_sort index-1 times, to swap element index-1 times
return recursive_sort(array, index - 1);
}
recursive_sort(arr, arr.length);
console.log("The sorted array is ", arr);
在输出中,用户可以观察到数组已被交换。
用户学习了三种在NodeJS中不使用for循环对数组进行排序的不同方法。在不使用for循环的情况下,使用数组reduce()方法是最好的排序数组的方法,因为它是一种更高效的方法。对于大型数组,递归方法可能会导致内存限制错误。