日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员必知的8大排序(四)-------归并排序,基数排序(java实现)

發布時間:2024/1/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员必知的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实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。