逐步解析Java歸併排序程式碼的實作過程
引言:
歸併排序是一種經典的分而治之演算法,將一個陣列分成兩個較小的數組,然後分別對這兩個數組進行排序,最後將兩個排序後的數字組合併成一個有序的數組。在本文中,我們將逐步解析Java中歸併排序的實作過程,並提供具體程式碼範例。
class MergeSort { // 归并排序函数 public void mergeSort(int[] array, int left, int right) { if (left < right) { // 找出中点 int mid = (left + right) / 2; // 递归排序左半部分和右半部分 mergeSort(array, left, mid); mergeSort(array, mid + 1, right); // 合并排序好的左半部分和右半部分 merge(array, left, mid, right); } } // 合并函数 public void merge(int[] array, int left, int mid, int right) { // 定义临时数组来存储合并后的数组 int[] temp = new int[right - left + 1]; int i = left; int j = mid + 1; int k = 0; // 将左半部分和右半部分按顺序合并到临时数组中 while (i <= mid && j <= right) { if (array[i] <= array[j]) { temp[k++] = array[i++]; } else { temp[k++] = array[j++]; } } // 将剩余的元素复制到临时数组中 while (i <= mid) { temp[k++] = array[i++]; } while (j <= right) { temp[k++] = array[j++]; } // 将临时数组中的元素复制回原数组 for (int m = 0; m < temp.length; m++) { array[left + m] = temp[m]; } } // 测试 public static void main(String[] args) { int[] array = {8, 5, 2, 9, 5, 6, 3}; int n = array.length; MergeSort mergeSort = new MergeSort(); mergeSort.mergeSort(array, 0, n - 1); System.out.println("归并排序结果:"); for (int i = 0; i < n; i++) { System.out.print(array[i] + " "); } } }
mergeSort
方法是歸併排序的入口函數,它接收一個待排序的陣列以及陣列的左右邊界。在這個函數中,我們首先判斷左右邊界是否滿足拆分的條件(即left ),如果滿足,則找出數組的中點,並遞歸調用<code>mergeSort
函數將左半部和右半部進行排序。最後,呼叫merge
函數將兩個有序的子數組合併為一個有序的陣列。
merge
函數中,我們建立一個臨時數組來儲存合併後的子數組,然後定義三個指標i
、j
、k
分別指向左半部的起始位置、右半部的起始位置、臨時陣列的起始位置。我們比較左半部和右半部的元素大小,將較小的元素放入臨時數組中,並將對應指針後移一位。如果某一個子數組的所有元素都放入了臨時數組中,那麼我們將剩下子數組中的元素複製到臨時數組的末尾。最後,我們將臨時數組中的元素複製回原始數組。
以上是逐步分析Java歸併排序的實作步驟的詳細內容。更多資訊請關注PHP中文網其他相關文章!