一、基本思想
歸併排序是建立在歸併操作上的一種有效的排序演算法。此演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。
二、演算法分析
1、演算法描述
把長度為n的輸入序列分成兩個長度為n/2的子序列;對這兩個子序列分別採用歸併排序;將兩個排序好的子序列合併成一個最終的排序序列。
2、過程分析
(1)、現在我們將拆分項[1] (指數從0 到0,兩邊都包含) 和[28] 指數從1 到1 ,兩邊都包括) 歸併在一起。
(2)、因為 1 (左拆分)
(3)、因為左拆分是空的,我們將 28 (右拆分)複製到新的陣列。
(4)、我們將新陣列中的元素拷貝回原來的陣列中。
(5)、因為 3 (左拆分)
(6)、因為左拆分是空的,我們將 21 (右拆分)複製到新的陣列。
(7)、現在我們將拆分項[1,28] (指數從0 到1,兩邊都包含) 和[3,21] 指數從2到3 ,兩邊都包括) 歸併在一起。
(8)、因為 1 (左拆分)
(9)、因為 28 (左拆分) > 3 (右拆分), 我們將 {rightPart} 複製新的陣列。
(10)、因為 28 (左拆分) > 21 (右拆分), 我們將 {rightPart} 複製新的陣列。
(11)、因為右拆分是空的,我們將28 (左拆分) 拷貝進新的陣列。
(12)、我們將新陣列中的元素拷貝回原來的陣列中。
(13)、現在我們將拆分項[11] (指數從4 到4,兩邊都包含) 和[7] 指數從5 到5 ,兩邊都包括) 歸併在一起。
(14)、因為 11 (左拆分) > 7 (右拆分), 我們將 {rightPart} 複製新的陣列。
(15)、因為右拆分是空的,我們將11 (左拆分) 拷貝進新的陣列。
(16)、我們將新陣列中的元素拷貝回原來的陣列中。
(17)、以此類推
(18)、因為1 (左拆分)
(19)、因為 3 (左拆分)
(20)、因為 21 (左拆分) > 6 (右拆分), 我們將 {rightPart} 複製新的陣列。
(21)、因為 21 (左拆分) > 7 (右拆分), 我們將 {rightPart} 複製新的陣列。
(22)、以此類推,我們將新數組中的元素拷貝回原來的陣列中。
3、動圖示範
#三、演算法實作
package com.algorithm.tenSortingAlgorithm; import java.util.Arrays; public class MergeSort { private static void mergeSort(int[] arr, int low, int high) { if (low < high) { //当子序列中只有一个元素时结束递归 int mid = (low + high) / 2; //划分子序列 mergeSort(arr, low, mid); //对左侧子序列进行递归排序 mergeSort(arr, mid + 1, high); //对右侧子序列进行递归排序 merge(arr, low, mid, high); //合并 } } private static void merge(int[] arr, int low, int mid, int high) { int[] temp = new int[arr.length]; //辅助数组 int k = 0, i = low, j = mid + 1; //i左边序列和j右边序列起始索引,k是存放指针 while (i <= mid && j <= high) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } //如果第一个序列未检测完,直接将后面所有元素加到合并的序列中 while (i <= mid) { temp[k++] = arr[i++]; } //同上 while (j <= high) { temp[k++] = arr[j++]; } //复制回原数组 for (int t = 0; t < k; t++) { arr[low + t] = temp[t]; } } public static void main(String[] args) { int[] arr = {1,28,3,21,11,7,6,18}; mergeSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } }
以上是Java中歸併排序演算法的原理是什麼幾怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器