【算法】归并排序
算法 系列博客
【算法】刷題范圍建議 和 代碼規范
【算法】復雜度理論 ( 時間復雜度 )
【字符串】最長回文子串 ( 蠻力算法 )
【字符串】最長回文子串 ( 中心線枚舉算法 )
【字符串】最長回文子串 ( 動態規劃算法 ) ★
【字符串】字符串查找 ( 蠻力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )
【算法】雙指針算法 ( 雙指針算法分類 | 相向雙指針 | 有效回文串 )
【算法】雙指針算法 ( 有效回文串 II )
【算法】哈希表 ( 兩數之和 )
【算法】快速排序
【算法】歸并排序
文章目錄
- 算法 系列博客
- 一、歸并排序
一、歸并排序
歸并排序 : https://www.lintcode.com/problem/463
歸并排序原理 :
歸并排序 先分割為兩部分 , 然后兩邊分別排序 , 再進行合并 ;
先局部有序 , 后整體有序 ;
歸并排序 與 快速排序 比較 , 其比 快排 多花費 O(n)O(n)O(n) 的空間 , 其合并兩個數組時 , 不能在原數組中進行 ;
快速排序 , 始終都在原數組中進行 , 只涉及到交換數組中的元素 ;
正式由于該額外數組的存在 , 因此歸并排序 , 并不是排序的最優算法 ;
算法要點 :
合并數組中 , 創建數組的時機 , 不要放在遞歸中 , 遞歸要調用很多次 , 頻繁創建銷毀數組 , 很耗費時間和空間 ;
代碼示例 :
class Solution {/*** 歸并排序* @param A*/public void sortIntegers(int[] A) {if (A == null || A.length == 0) {return;}// 用于合并數組的額外空間int mergeArray[] = new int[A.length];// 遞歸調用排序算法mergeSort(A, 0, A.length - 1, mergeArray);}// 將 array 數組中 start 到 end 之間的元素進行排序private void mergeSort(int[] array, int start, int end, int[] mergeArray) {if (start >= end) {// start 如果等于 end, 說明就一個元素, 不用排序// start 正常情況下不會大于 endreturn;}// 先在中間切一刀, 左側右側進行分別排序// 左側排序mergeSort(array, start, (start + end) / 2, mergeArray);// 右側排序mergeSort(array, (start + end) / 2 + 1, end, mergeArray);// 進行歸并操作, 將已經排好序的兩側的數組進行合并merge(array, start, end, mergeArray);}// 合并兩個已經排好序的數組private void merge(int[] array, int start, int end, int[] mergeArray) {// 左右兩個數組的遍歷索引, 初值值為左右兩側的開始索引int leftIndex = start;int rightIndex = (start + end) / 2 + 1;// 記錄 mergeArray 的賦值索引int mergeIndex = leftIndex;while (leftIndex <= (start + end) / 2 && rightIndex <= end) {if (array[leftIndex] < array[rightIndex]){// 先賦值, 然后索引自增mergeArray[mergeIndex++] = array[leftIndex++];} else {mergeArray[mergeIndex++] = array[rightIndex++];}}// 上述賦值完畢后, 可能有一側還有若干元素沒有賦值完畢// 檢查左側是否賦值完畢, 如果沒有賦值完畢, 則繼續遍歷, 如果賦值完畢, 則不會進入循環while (leftIndex <= (start + end) / 2) {mergeArray[mergeIndex++] = array[leftIndex++];}// 檢查右側是否賦值完畢, 如果沒有賦值完畢, 則繼續遍歷, 如果賦值完畢, 則不會進入循環while (rightIndex <= end) {mergeArray[mergeIndex++] = array[rightIndex++];}// 上述操作將排序號的元素都放在 mergeArray 數組中, 在將其設置到 array 數組中for (int i = start; i <= end; i++) {array[i] = mergeArray[i];}} }總結
- 上一篇: 【错误记录】Google Play 上架
- 下一篇: 【错误记录】Android Studio