生活随笔
收集整理的這篇文章主要介紹了
程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載:http://blog.csdn.net/pzhtpf/article/details/7560312
?
7、歸并排序
?
(1)基本排序:歸并(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。
(2)實例:
(3)用Java實現
[plain]?view plaincopy
import?java.util.Arrays;?? ?? public?class?mergingSort?{?? int?a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};?? public??mergingSort(){?? ????sort(a,0,a.length-1);?? ????for(int?i=0;i<a.length;i++)?? ????????System.out.println(a[i]);?? }?? public?void?sort(int[]?data,?int?left,?int?right)?{?? ????//?TODO?Auto-generated?method?stub?? ????if(left<right){?? ????????//找出中間索引?? ????????int?center=(left+right)/2;?? ????????//對左邊數組進行遞歸?? ????????sort(data,left,center);?? ????????//對右邊數組進行遞歸?? ????????sort(data,center+1,right);?? ????????//合并?? ????????merge(data,left,center,right);?? ?????????? ????}?? }?? public?void?merge(int[]?data,?int?left,?int?center,?int?right)?{?? ????//?TODO?Auto-generated?method?stub?? ????int?[]?tmpArr=new?int[data.length];?? ????int?mid=center+1;?? ????//third記錄中間數組的索引?? ????int?third=left;?? ????int?tmp=left;?? ????while(left<=center&&mid<=right){?? ????????//從兩個數組中取出最小的放入中間數組?? ????????if(data[left]<=data[mid]){?? ????????????tmpArr[third++]=data[left++];?? ????????}else{?? ????????????tmpArr[third++]=data[mid++];?? ????????}?? ????}?? ????//剩余部分依次放入中間數組?? ????while(mid<=right){?? ????????tmpArr[third++]=data[mid++];?? ????}?? ????while(left<=center){?? ????????tmpArr[third++]=data[left++];?? ????}?? ????//將中間數組中的內容復制回原數組?? ????while(tmp<=right){?? ????????data[tmp]=tmpArr[tmp++];?? ????}?? ????System.out.println(Arrays.toString(data));?? }?? ?? }??
[plain]?view plaincopy
??
[plain]?view plaincopy
??
8、基數排序
?
(1)基本思想:將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后,數列就變成一個有序序列。
(2)實例:
(3
)用java
實現
[plain]?view plaincopy
import?java.util.ArrayList;?? ?? import?java.util.List;?? ?? ??? ?? public?class?radixSort?{?? ?? ?????????int?a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,101,56,17,18,23,34,15,35,25,53,51};?? ?? public?radixSort(){?? ?? ?????????sort(a);?? ?? ?????????for(int?i=0;i<a.length;i++)?? ?? ???????????????????System.out.println(a[i]);?? ?? }?? ?? public??void?sort(int[]?array){????? ?? ?????????????????????? ?? ?????????????????//首先確定排序的趟數;????? ?? ????????int?max=array[0];????? ?? ????????for(int?i=1;i<array.length;i++){????? ?? ????????????????????if(array[i]>max){????? ?? ???????????????max=array[i];????? ?? ????????????????????}????? ?? ?????????????????}????? ?? ?????????????????????? ?? ????????int?time=0;????? ?? ????????????????//判斷位數;????? ?? ?????????????????while(max>0){????? ?? ????????????????????max/=10;????? ?? ?????????????????????time++;????? ?? ?????????????????}????? ?? ?????????????????????? ?? ????????//建立10個隊列;????? ?? ?????????????????List<ArrayList>?queue=new?ArrayList<ArrayList>();????? ?? ?????????????????for(int?i=0;i<10;i++){????? ?? ??????????????????????????ArrayList<Integer>?queue1=new?ArrayList<Integer>();??? ?? ?????????????????????queue.add(queue1);????? ?? ????????}????? ?? ????????????????????? ?? ?????????????????//進行time次分配和收集;????? ?? ?????????????????for(int?i=0;i<time;i++){????? ?? ?????????????????????????? ?? ?????????????????????//分配數組元素;????? ?? ????????????????????for(int?j=0;j<array.length;j++){????? ?? ?????????????????????????//得到數字的第time+1位數;??? ?? ?????????????????????????????int?x=array[j]%(int)Math.pow(10,?i+1)/(int)Math.pow(10,?i);?? ?? ?????????????????????????????ArrayList<Integer>?queue2=queue.get(x);?? ?? ?????????????????????????????queue2.add(array[j]);?? ?? ?????????????????????????????queue.set(x,?queue2);?? ?? ????????????}????? ?? ?????????????????????int?count=0;//元素計數器;????? ?? ????????????//收集隊列元素;????? ?? ?????????????????????for(int?k=0;k<10;k++){??? ?? ????????????????while(queue.get(k).size()>0){?? ?? ?????????????????????????ArrayList<Integer>?queue3=queue.get(k);?? ?? ?????????????????????????????array[count]=queue3.get(0);????? ?? ?????????????????????????????queue3.remove(0);?? ?? ????????????????????count++;?? ?? ??????????????}????? ?? ????????????}????? ?? ???????????????}????? ?? ?????????????????????? ?? ???}???? ?? ??? ?? } ?
總結
以上是生活随笔為你收集整理的程序员必知的8大排序(四)-------归并排序,基数排序(java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。