Java实现归并排序 Merge Sort
生活随笔
收集整理的這篇文章主要介紹了
Java实现归并排序 Merge Sort
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文帶來八大排序算法之歸并排序算法。
歸并排序是利用歸并思想實現的排序算法,該算法采用經典的分治DAC(divide -?and -?conquer)策略。分治法將問題分(divide)成一些小的問題,然后遞歸求解,而治(conquer)的階段將分的階段得到的各答案“修補”在一起,即分而治之。
歸并排序思想圖解:
分的過程:只是將8個數據分成八組(直到不可再分為止),分是為后面的治提供遞歸條件。
治的階段:將兩個有序的子序列合并成一個有序序列,以上圖最后一次合并為例,將[4, 5, 7, 8]? 和 [1, 2, 3, 6]這兩個已經有序的子序列合并為最終序列[1,2,3,4,5,6,7,8]
上圖總共合并4+2+1=7次。
temp是臨時數組
?
代碼實現及注釋:
import java.util.Arrays;public class MergeSort {// Driver method public static void main(String args[]) {int arr[] = { 8, 4, 5, 7, 1, 3, 6, 2 }; int[] temp = new int[arr.length]; //歸并排序需要額外空間mergeSort(arr, 0, arr.length-1, temp);System.out.println("歸并合并后:" + Arrays.toString(arr));}//分 + 合的方法public static void mergeSort(int[] arr, int left, int right, int[] temp){if(left < right){ //只要left索引小于right 就一直往下分divideint mid = (left + right) / 2; //中間索引//向左遞歸進行分解mergeSort(arr, left, mid, temp);//向右遞歸進行分解mergeSort(arr, mid + 1, right, temp);//合并。有余是遞歸,根據棧的機制,從上往下開始合并(從分解后一個元素為一組合并,然后2個元素一組,然后4個元素一組....)merge(arr, left, mid, right, temp);}}/*** * @param arr 待排序的數組* @param left 左邊有序序列的初始(注意是有序的,這時候已經divide完畢,每個組的數組已經是有序的了)索引 .參考示意圖 不同顏色表示不同部分* @param mid 中間索引* @param right 最右索引* @param temp 中轉數組*///合并的方法public static void merge(int[] arr, int left, int mid, int right, int[] temp){System.out.println("*******");int i = left; //初始化i 左邊有序序列的初始索引(注意是有序的,這時候已經divide完畢,每個組的數組已經是有序的了)int j = mid + 1; //初始化j 右邊有序序列的初始索引(注意是有序的,這時候已經divide完畢,每個組的數組已經是有序的了)int t = 0; //指向temp數組的當前索引//(一) 先把左右兩邊(已經是有序的,因為最小的時候只有 1個數)的數據按照規則填充到temp數組,直到左右兩邊的有序序列,有一邊處理完畢為止while(i <= mid && j <= right){ //如果左邊的有序序列的當前元素,小于等于右邊有序序列的當前元素//即將左邊有序序列的當前元素,拷貝到temp數組//然后 t++,i++if(arr[i] <= arr[j]){temp[t] = arr[i];t += 1;i += 1;}else{ //反之,將右邊有序序列的當前元素,拷貝到temp數組temp[t] = arr[j];t += 1;j += 1;}}//(二)把剩余數據的一邊的數據依次全部填充到tempwhile(i <= mid){ //左邊的有序序列還有剩余的元素,就全部填充到temptemp[t] = arr[i];t += 1;i += 1;}while(j <= right){ //右邊的有序序列還有剩余的元素,就全部填充到temptemp[t] = arr[j];t += 1;j += 1;}//(三)將temp數組的元素拷貝到arr//并不是每次 都拷貝所有元素(示例中為8個元素)t = 0;int tempLeft = left;System.out.println("tempLeft = " + tempLeft + " , right = " + right);while(tempLeft <= right){//第一次 tempLeft = 0, right = 1; //第二次 tempLeft = 2, right = 3;//第三次 tempLeft = 0, right = 3;//最后一次 tempLeft = 0, right = 7;arr[tempLeft] = temp[t];t += 1;tempLeft += 1;} }}7次合并打印:
?
總結
以上是生活随笔為你收集整理的Java实现归并排序 Merge Sort的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现快速排序 Quick Sor
- 下一篇: Java实现基数排序及其推导过程 Rad