如何在 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 – 使用 setInterval() 方法在每 2 秒后调用 sort_callback() 函数
步骤 2 – 使用 Math.min.apply() 方法从数组中获取最小元素。
步骤 3 – 将最小元素推入数组。
步骤 4 – 使用最小元素的索引,并将最小元素替换为 Infinity 值。
步骤 5 – 如果 len 变量的值等于数组长度,则表示所有数组元素都已排序,并清除间隔以停止通过 setInterval() 方法执行 sort_callback() 函数。
示例
在下面的示例中,我们创建了数值数组并应用了上述算法以升序对数组进行排序。用户可以使用 Math.max.apply() 方法以降序对数组进行排序,并将负 Infinity 值赋给最大元素。
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() 方法的执行完成,我们就可以得到已排序的数组。
语法
用户可以按照以下语法使用 array.reduce() 方法在 NodeJS 中无需使用循环即可对数组进行排序。
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; }, []);
在上述语法中,我们从数组中提取最小元素,将其推入数组,将最小元素替换为 Infinity,并从 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,则执行 return 语句。
步骤 2 – 将 count 变量初始化为 0。
步骤 3 – 使用 for 循环迭代数组,如果两个元素未排序则交换元素。当我们交换元素时,将 count 的值增加 1。
步骤 4 – 如果 count 值为 0,则不再需要交换,并从函数返回。
步骤 5 – 通过将 index 值减 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 循环对数组进行排序的最佳方法是使用 array.reduce() 方法,因为它是一种更高效的方法。对于大型数组,递归方法可能会导致内存限制错误。