归并排序java详解
生活随笔
收集整理的這篇文章主要介紹了
归并排序java详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
?
import java.util.Arrays;public class Mergesort {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));}/*要先“分”,因為后面要“并”,所以也就是分成一個一個的怎么分 ,可以從中間切,然后分成2組,這樣遞歸,直到分成都是一個一個的為什么merge寫在mergeSort里面一起遞歸 這個很巧妙因為mergeSort遞歸很明顯 從他最里面那層的mergeSort開始看它的merge最里面那層 也就是“分”完了的 然后在調用merge開始并 比如本題此時是八個數 兩個兩個并成一組再依次往外層merge 這樣遞歸這樣就能理解了*/public static void mergeSort(int[] arr,int left,int right,int[] temp){if(left<right){int mid=(left+right)/2;mergeSort(arr,left,mid,temp);//向左遞歸mergeSort(arr,mid+1,right,temp);//向右遞歸merge(arr,left,mid,right,temp);//在mergeSort里面調用合并的方法}}/*并的思想:并就是每次把兩個小組兩個小組并起來,并完之后小的放前面大的放后面(最開始是肯定兩個數兩個數合并,因為一開始都是單個的數)那怎么達到這個效果呢? 首先你要知道一點就是,每個小組肯定是小的在前面大的在后面所以就把前面那個小組的第一個數依次和后面那個小組的數比 假如比后者小 就直接放進temp數組里然后就繼續第一個小組第二個和那個數比 比他小 繼續放進temp 直到有比它大的才把第二組那個數放進去再拿第二組第二個跟第一組剛剛那個數比 這樣比下去...*///合并的方法public static void merge(int[] arr,int left,int mid,int right,int[] temp){int i=left;//初始化i,左邊有序序列的初始索引int j=mid+1;//初始化j,右邊有序序列的初始索引int t=0;//指向temp數組的當前索引while(i<=mid && j<=right){if(arr[i]<=arr[j]){//如果左邊那組的當前元素小于右邊,那么就將左邊那個元素填充到temptemp[t]=arr[i];t+=1;i+=1;}else{temp[t]=arr[j];//反之,將右邊元素填充到tempt+=1;j+=1;}//把有剩余數據的一邊的數據一次全部填充到tempwhile (i<=mid){temp[t]=arr[i];t+=1;i=+1;}while (j<=right){temp[t]=arr[j];t+=1;j=+1;}//將temp數組的元素全部拷貝到arr//注意:不是每次拷貝所有 因為是一層一層的 每次并完一層就拷貝一層到arr 所以每層arr中元素順序都不一樣的 因為比過大小了t=0;int tempLeft=left;while(tempLeft<=right){arr[tempLeft]=temp[t];t+=1;tempLeft+=1;}}}}?
總結
以上是生活随笔為你收集整理的归并排序java详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬盘坏道修复白皮书
- 下一篇: 分享到系统面板_win7电脑没有nvid