插入排序是電腦科學中的另一個基本排序演算法。它一次建立一個最終的排序數組。這很像對一手撲克牌進行排序 - 您一張一張地拿起紙牌,並將每張紙牌插入您已排序的紙牌中的正確位置。
插入排序迭代數組,每次迭代都會增加已排序的部分。對於每個元素,它將與已排序的元素進行比較,向上移動它們,直到找到插入當前元素的正確位置。
以下是逐步說明:
插入排序的視覺化:
錄製的 gif 來自 https://visualgo.net/en/sorting
讓我們來看看JavaScript中插入排序的實現,每個部分都有詳細的註釋解釋:
function insertionSort(arr) { // Start from the second element (index 1) // We assume the first element is already sorted for (let i = 1; i < arr.length; i++) { // Store the current element we're trying to insert into the sorted portion let currentElement = arr[i]; // Define the starting index of lookup (this is the last index of sorted portion of array) let j = j - 1; // Move elements of arr[0..i-1] that are greater than currentElement // to one position ahead of their current position while (j >= 0 && arr[j] > currentElement) { // Shift element to the right arr[j + 1] = arr[j]; j--; } // We've found the correct position for currentElement (at j + 1), insert it: arr[j + 1] = currentElement; } // The array is now sorted in-place: return arr; }
for (let i = 1; i < arr.length; i++)
在陣列中向前移動,一次選擇一個未排序的元素 (currentElement = arr[i])。
while (j >= 0 && arr[j] > currentElement)
向後查看已排序的部分,向右移動較大的元素 (arr[j 1] = arr[j]) 以為當前元素騰出空間。
arr[j + 1] = currentElement;
將目前元素插入到正確的位置,增加排序部分。
插入排序每次建立一個最終排序數組,模仿您對一手牌進行排序的方式。它重複地從未排序的部分中選擇一張卡片(元素)並將其插入到已排序的卡片中的正確位置,並根據需要移動較大的卡片。這種直觀的過程使得插入排序對於小型或接近排序的資料集非常有效率。
是的,插入排序是一種穩定的排序演算法。排序演算法的穩定性意味著相等元素的相對順序在排序後得以保留。插入排序因其操作方法而自然地實現了這一點:
在對複雜資料結構進行排序時,插入排序的穩定性特別有用,因為保持相等元素的原始順序非常重要。例如,當先按年級然後按姓名對學生列表進行排序時,穩定的排序將確保具有相同年級的學生仍按姓名的字母順序排列。
這種穩定性是基本插入排序演算法的固有屬性,不需要任何額外的修改或開銷即可實現,使其成為一種天然穩定的排序方法。
插入排序的效能特性如下:
時間複雜度:
空間複雜度:O(1) - 插入排序是一種就地排序演算法
與選擇排序不同,插入排序可以在近排序數組上表現良好,在這種情況下實現接近線性的時間複雜度。
優點:
缺點:
插入排序儘管對於大型資料集有局限性,但在特定場景中提供了寶貴的優勢。它的直觀性,類似於我們手動對卡片進行排序的方式,使其成為理解排序演算法的優秀教育工具。
重點:
雖然不適合大規模排序任務,但插入排序的原理通常應用於更複雜的方法。它在某些場景下的簡單性和高效性使其成為程式設計師演算法工具包的寶貴補充。
排序演算法的選擇最終取決於您的特定用例、資料特徵和系統約束。了解插入排序可以深入了解演算法設計權衡,並為探索更高級的排序技術奠定基礎。
以上是使用 Javascript 進行演算法之旅 - 插入排序的詳細內容。更多資訊請關注PHP中文網其他相關文章!