排序演算法03-歸併排序
阿新 • • 發佈:2018-11-20
與之前的排序不同,歸併排序採用分而治之的演算法設計思想,最終的時間複雜度為;
歸併排序的實現步驟:
1.分割:不斷的將陣列分割成兩個新陣列,直到長度為1;
2.合併:合併的過程也就是排序的過程,將兩個陣列按元素大小順序合併成一個新陣列,直到全部合併;
實現原理如下圖:
實現歸併排序的簡單程式如下:
// 分割方法 public static int[] mergeSort(int[] arr) { if (arr.length > 1) { int[] firstHalf = new int[arr.length / 2]; System.arraycopy(arr, 0, firstHalf, 0, arr.length / 2); // 繼續分割前半段 mergeSort(firstHalf); int secondHalfLen = arr.length - arr.length / 2; int[] secondHalf = new int[secondHalfLen]; System.arraycopy(arr, arr.length / 2, secondHalf, 0, secondHalfLen); // 繼續分割後半段 mergeSort(secondHalf); // 分割之後呼叫合併方法 merge(firstHalf, secondHalf, arr); } return arr; } // 合併方法 public static void merge(int[] arr1, int[] arr2, int[] temp) { int index1 = 0; int index2 = 0; int index3 = 0; while (index1 < arr1.length && index2 < arr2.length) { temp[index3++] = arr1[index1] < arr2[index2] ? arr1[index1++] : arr2[index2++]; } while (index1 < arr1.length) temp[index3++] = arr1[index1++]; while (index2 < arr2.length) temp[index3++] = arr2[index2++]; }