归并排序算法图解分析
生活随笔
收集整理的這篇文章主要介紹了
归并排序算法图解分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、歸并排序介紹
- 二、圖解
- 三、代碼分析
- 1.合并有序數組
- 2.分的過程
- 三、完整代碼
一、歸并排序介紹
歸并排序使用的方法是分治法,即將問題分解為許多類似的小問題然后遞歸求解。
這里不做詳細分析,直接看圖解過程。
二、圖解
分的過程:可以直接除以二分割(這里總數是奇數也可以)。
治的過程:核心是合并兩個有序的數組。
三、代碼分析
1.合并有序數組
歸并排序的核心就是治的過程也就是合并兩個有序的數組。實現過程如下(以升序排序為例):
圖解:
以arr1 = {1,5,6};arr2 ={3,7,9}為例。
左右比較,填入1,左邊后移一位。
左右比較,填入3,右邊后移一位。
左右比較,填入5,左邊后移一位。
左右比較,填入6,左邊后移一位。
指針越界,將右邊元素依次填入。
合并完成。
代碼:
下面代碼中合并的是原始數組中arr[left 到 mid]段與arr[mid+1 到 right]段,故最后將臨時數組temp中的元素拷貝會arr[left 到 right]段(因為整個排序過程是還在原始數組中進行的)。left,mid,right這是進行假想的分割,詳細的分的過程后面的代碼。
2.分的過程
代碼:
使用遞歸進行分割,然后使用merge方法合并數組。
三、完整代碼
public static void main(String[] args) {int arr[] = {4,5,8,20,6,87,12,65,0,855,12,5,78};mergeSort(arr);System.out.println(Arrays.toString(arr));}public static void mergeSort(int[] arr){Sort(arr, 0, arr.length() - 1);}public static void Sort(int[] arr, int left, int right){if(left < right){int mid = (left+right)/2;//取中間值Sort(arr, left, mid);//分Sort(arr, mid+1, right);//分merge(arr, left, mid, right); //治}}public static void merge(int[] arr, int left, int mid, int right){int[] temp = new int[right-left+1];int l = left;//左數組初始索引int m = mid + 1;//右數組初始索引int t = 0;//臨時數組初始索引//1.將左右數組元素按規則填入temp數組中while(l <= mid && m <= right){if(arr[l] > arr[m]){temp[t] = arr[m];m++;t++;}else{temp[t] = arr[l];l++;t++;}}//2.將數組剩余元素填入temp中if(l > mid){while(m <= right){temp[t] = arr[m];m++;t++;}}else{while(l <= mid ){temp[t] = arr[l];l++;t++;}}//3.將temp數組拷貝到arr中t = 0;l = left;while(l <= right){arr[l] = temp[t];l++;t++;}} }測試結果:
[0, 4, 5, 5, 6, 8, 12, 12, 20, 65, 78, 87, 855]
總結
以上是生活随笔為你收集整理的归并排序算法图解分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面向对象(1) —— 封装
- 下一篇: Creo 由方程创建曲线