歸併排序 Java__Data

來源:互聯網
上載者:User

一、利用分治演算法的思想,假設下標為0~7,分治過程如下:

        [0~7]全部無序       /    \    [0~3]    [4~7]子序列內無序       /  \      /   \[0~1] [2~3]  [4~5] [6~7]子序列內無序 / \  /  \   /   \  /  \0   1 2  3   4   5  6   7子序列內有序 \ /  \  /   \  /   \  /[0~1] [2~3]  [4~5]  [6~7]子序列內有序  \   /        \    /    [0~3]      [4~7]子序列內有序         \     /          [0~7]全部有序

二、歸併排序演算法如下,其中數組 r 儲存排序後的結果, s 為待排序來源資料數組:

public static void mergeSort(int [] r, int [] s, int begin, int end){if(begin == end){return;}int middle = (begin + end)/2;mergeSort(r, s, begin, middle);mergeSort(r,s, middle + 1, end);merge(r, s, begin, middle, end);}

其中搜集排序結果的函數merge如下:

public static void merge(int [] r, int [] s, int begin, int middle, int end){int i = begin;int j = middle + 1;int k = begin;while(i <= middle && j <= end){if(s[i] <= s[j]){r[k++] = s[i++];}else{r[k++] = s[j++];}}if(i <= middle){for(; i <= middle; i++){r[k++] = s[i];}}if(j <= end){for(; j <= end; j++){r[k++] = s[j];}}//把有序序列r[begin]~r[end],回寫到s[begin]~s[end],這一步很重要for(int l = begin; l <= end; l++){s[l] = r[l];}}

三、完整的測試程式如下:

package mergeSort;public class MergeSort {public static int [] s = new int[]{5,11,6,4,1,10,9,8,7};public static int [] r = new int[s.length];public static void main(String[] args) {printArr(s, "排序前:");mergeSort(r,s,0,s.length - 1);//調用歸併排序printArr(r, "排序後:");//列印排序結果}//執行歸併排序public static void mergeSort(int [] r, int [] s, int begin, int end){if(begin == end){return;}int middle = (begin + end)/2;mergeSort(r, s, begin, middle);mergeSort(r,s, middle + 1, end);merge(r, s, begin, middle, end);}//把兩個無序的子序列s[begin]~s[middle]和子序列s[middle + 1]~s[end]合并為一個有序序列r[begin]~r[end],然後回寫到s[begin]~s[end]public static void merge(int [] r, int [] s, int begin, int middle, int end){int i = begin;int j = middle + 1;int k = begin;while(i <= middle && j <= end){if(s[i] <= s[j]){r[k++] = s[i++];}else{r[k++] = s[j++];}}if(i <= middle){for(; i <= middle; i++){r[k++] = s[i];}}if(j <= end){for(; j <= end; j++){r[k++] = s[j];}}//把有序序列r[begin]~r[end],回寫到s[begin]~s[end],這一步很重要for(int l = begin; l <= end; l++){s[l] = r[l];}}public static void printArr(int [] arr, String flag){System.out.print(flag);for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + "");}System.out.println();}}

四、測試程式運行結果如下:

排序前:51164110987排序後:14567891011


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.