如何在 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+ 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.