您好,登錄后才能下訂單哦!
在java項目中實現歸并排序的方法?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
歸并排序算法:假設初始序列含有n個記錄,首先將這n個記錄看成n個有序的子序列,每個子序列長度為1,然后兩兩歸并,得到n/2個長度為2(n為奇數的時候,最后一個序列的長度為1)的有序子序列。在此基礎上,再對長度為2的有序子序列進行亮亮歸并,得到若干個長度為4的有序子序列。如此重復,直到得到一個長度為n的有序序列為止。這種方法被稱作是:2-路歸并排序(基本操作是將待排序列中相鄰的兩個有序子序列合并成一個有序序列)。
算法實現代碼如下:
package exp_sort; public class MergeSort { /** * 相鄰兩個有序子序列的合并算法 * * @param src_array * @param low * @param high * @param des_array */ public static void Merge(int src_array[], int low, int high, int des_array[]) { int mid; int i, j, k; mid = (low + high) / 2; i = low; k = 0; j = mid + 1; // compare two list while (i <= mid && j <= high) { if (src_array[i] <= src_array[j]) { des_array[k] = src_array[i]; i = i + 1; } else { des_array[k] = src_array[j]; j = j + 1; } k = k + 1; } // if 1 have,cat while (i <= mid) { des_array[k] = src_array[i]; k = k + 1; i = i + 1; } while (j <= high) { des_array[k] = src_array[j]; k = k + 1; j = j + 1; } for (i = 0; i < k; i++) { src_array[low + i] = des_array[i]; } } /** * 2-路歸并排序算法,遞歸實現 * * @param src_array * @param low * @param high * @param des_array */ public static void mergeSort(int src_array[], int low, int high, int des_array[]) { int mid; if (low < high) { mid = (low + high) / 2; mergeSort(src_array, low, mid, des_array); mergeSort(src_array, mid + 1, high, des_array); Merge(src_array, low, high, des_array); } } public static void main(String[] args) { // TODO Auto-generated method stub int array1[] = { 38, 62, 35, 77, 55, 14, 35, 98 }; int array2[] = new int[array1.length]; mergeSort(array1, 0, array1.length - 1, array2); System.out.println("\n----------after sort-------------"); for (int ii = 0; ii < array1.length; ii++) { System.out.print(array1[ii] + " "); } System.out.println("\n"); } }
代碼解釋:
歸并排序中一趟歸并要多次調用到2-路歸并算法,一趟的歸并的時間復雜度是O(n),合并兩個已經排好序的表的時間顯然是線性的,因為最多進行了n-1次比較,其中n是元素的總數。如果有多個數,即n不為1時,遞歸的將前半部分數據和后半部分數據各自歸并排序,得到排序后的兩部分數據,再合并到一起。
算法分析:
該算法是建立在歸并操作(也叫歸并算法,指的是將兩個已經排序的序列合并成一個序列的操作)上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用,它將問題分成一些小的問題然后遞歸求解,而治的階段則是將分的階段解得的各個答案修補到一塊;分治是遞歸非常有力的用法。注意:與快速·排序和堆排序比較,歸并排序最大的特點就是,它一種穩定的排序方法。速度僅次于快速排序,一般用于對總體無序,但是各子項相對有序的數列。
復雜度:
時間復雜度為:O(nlogn) ——該算法最好、最壞和平均的時間性能。
空間復雜度為 :O(n)
比較操作的次數介于(nlogn) / 2和 nlogn - n + 1之間。
賦值操作的次數是(2nlogn)。歸并算法的空間復雜度為:0 (n)
很難用于主存排序(歸并排序比較占用內存,主要問題在于合并兩個排序的表需要線性附加內存,在整個算法中還要花費將數據拷貝到臨時數組再拷貝回來這樣的一些附加操作,其結果嚴重放慢了排序的速度)但是效率很高,主要用于外部排序,對于重要的內部排序應用而言,一般還是選擇快速排序。
歸并操作的步驟如下:
第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
第二步:設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
重復步驟3直到某一指針達到序列尾
將另一序列剩下的所有元素直接復制到合并序列尾
歸并排序的步驟如下(假設序列共有n個元素):
將序列每相鄰兩個數字進行歸并操作(merge),形成floor(n/2)個序列,排序后每個序列包含兩個元素
將上述序列再次歸并,形成floor(n/4)個序列,每個序列包含四個元素
重復步驟2,直到所有元素排序完畢
看完上述內容,你們掌握在java項目中實現歸并排序的方法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。