了解歸併排序演算法(附Java範例)
合併排序:綜合指引
合併排序是一種高效的排序演算法,經常在各種程式語言中使用,無論是獨立的還是作為混合方法的一部分。 它的基礎在於分而治之的典範:一個問題被分解成更小的子問題,單獨解決,然後將它們的解決方案組合起來得到最終結果。 合併排序遞歸地將輸入清單分成兩半,對每一半進行排序,然後合併已排序的兩半以產生完全排序的清單。
理解合併排序過程
讓我們使用範例陣列來說明合併排序過程:
此圖描繪了陣列的遞歸劃分。
此圖顯示了排序子陣列的合併。
實現合併排序
以下是歸併排序演算法的 Java 實作:
import java.util.Arrays; public class MergeSortTest { public static void main(String[] args){ int[] arr = {8, 2, 6, 4, 9, 1}; System.out.println("Unsorted array: " + Arrays.toString(arr)); mergeSort(arr, 0, arr.length-1); System.out.println("Sorted array: " + Arrays.toString(arr)); } static void mergeSort(int arr[], int start, int end){ if (start < end){ int mid = (start + end) / 2; mergeSort(arr, start, mid); mergeSort(arr, mid + 1, end); merge(arr, start, mid, end); } } static void merge(int arr[], int start, int mid, int end){ int[] left = new int[(mid - start) + 1]; int[] right = new int[end - mid]; for(int i = 0; i <= mid - start; i++) left[i] = arr[start + i]; for(int j = 0; j < end - mid; j++) right[j] = arr[mid + 1 + j]; int i = 0, j = 0; int k = start; while (i < left.length && j < right.length){ if(left[i] <= right[j]){ arr[k] = left[i]; i++; } else{ arr[k] = right[j]; j++; } k++; } while (i < left.length){ arr[k] = left[i]; i++; k++; } while (j < right.length){ arr[k] = right[j]; j++; k++; } } }
代碼說明
mergeSort
方法遞歸地分割數組,直到子數組只包含一個元素。 merge
方法至關重要;它會取得已排序的子陣列並將它們有效地合併為單一已排序的陣列。 合併過程涉及比較兩個子數組中的元素並將較小的元素放入主數組中。
此圖說明了合併步驟。
程式碼的輸出是:
未排序數組:[8,2,6,4,9,1] 排序數組:[1, 2, 4, 6, 8, 9]
演算法複雜度
- 時間複雜度: 在所有情況下(最佳、平均和最差)O(n log n)。這是因為無論輸入數組的初始順序如何,分而治之的方法都保持一致。
- 空間複雜度: O(n),因為合併作業期間臨時陣列需要額外的空間。
以上是了解歸併排序演算法(附Java範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...
