归并排序java版
歸并排序java版
- 歸并排序java版
歸并排序java版
好長時間沒寫過歸并排序,在學習并發中又遇到了一個歸并排序的demo,于是就想試試自己還能不能寫出來,結果沒寫出來…,看了一些文章后,整理了一下思路,把歸并排序寫了出來,在這里自己分析一下,加強記憶。
歸并排序的思想是分而治之,總之就是拆分,拆分,再拆分,將粒度降到最低,然后再進行合并,合并,再合并。
轉載部分圖片從外部:
拆分圖解:
通過看臨時數組,將源數據左右部分放到臨時數組;
使用i,j兩個索引控制索引位;
當i<j位的數據,則把i位放入temp,否則將j位數據放入temp,并將對應索引+1;
最后將當一側索引達到盡頭,另一側數據由于已經有了順序,則直接全部放入temp中即可;
直接貼代碼:
public class MergeSortDemo {public static void merge(int[] arr, int left, int right, int[] temp){// int mid = (left+right)/2;int mid = left+(right-left)/2;int i=left;int j = mid+1;int index = left;//當l小于等于中間點,j小于等于右索引//只有滿足以下兩個條件才能進行循環//下面的操作是以左右兩邊的同時向右推進,//左側的數值小則將左側的索引位數值放到temp[index]中,同時左索引+1,index+1;//右側的數值小則將右側的索引位數值放到temp[index]中,同時右索引+1,index+1;while (i<=mid && j <=right ){if(arr[i]<arr[j]){temp[index++] = arr[i++];}else {temp[index++] = arr[j++];}}//當條件不滿足時,必須是i>mid或j>right才會不滿足;//此時由于排序,左側數據的右端大于左端(拆分后的數據經過排序各部分已經具有順序);////一旦i>mid,則代表左側全部放到temp中,也代表左側數據較小,全部小于右側剩余的數據,右側剩余的數據已經具有順序,則可以直接添加到temp后尾;//將剩余的數據放到temp中,//下面兩個while只能滿足其一;while (i<=mid){temp[index++] = arr[i++];}while (j<=right){temp[index++] = arr[j++];}//再將數據回填到arr中;i=left;j=left;//只把左右索引這部分數據進行回填,while (i<=right){arr[i++]=temp[j++];}}/**** @param arr 源數組* @param left 左索引* @param right 右索引* @param temp 臨時數組*/public static void sort(int arr[],int left,int right,int temp[]){//如果左索引小于右索引,則排序if(left<right){//左排序,每次折半排序,從左索引,到中間點;sort(arr,left,left+(right-left)/2,temp);//右排序,從中間點+1,到右索引,由于上邊排序包含中間點,所以下面的必須中間點+1;sort(arr,left+(right-left)/2+1,right,temp);//合并merge(arr,left,right,temp);}}public static void main(String[] args) {int arr[]=new int[]{1,9,7,10,8,14,3,5,2,6,78,16,78,88};int arr2[]=new int[arr.length];sort(arr,0,arr.length-1,arr2);for (int i : arr) {System.out.println(i);}} }文中圖片來源于外鏈
外鏈參考文章地址:
點擊跳轉
總結
- 上一篇: 云计算机创意名,有创意的道路名字推荐,分
- 下一篇: 11月22日北京.net俱乐部活动ppt