如何在 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() 方法,因为它是一种更高效的方法。对于大型数组,递归方法可能会导致内存限制错误。

更新于:2023年3月6日

1K+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告