黑马程序员技术交流社区

标题: Java排序只归并排序算法 [打印本页]

作者: 麦子    时间: 2013-6-12 23:10
标题: Java排序只归并排序算法
本帖最后由 麦子 于 2013-6-12 23:12 编辑

  1. <P>import java.util.Date;
  2. public class Sort {

  3. /**
  4. * 作者:麦子
  5. * 功能:实现归并排序排序算法
  6. */
  7. public static void main(String[] args) {
  8. int len=100000;
  9. int[] arrg=new int[len];
  10. for(int i=0;i<len;i++){
  11. int t=(int)(Math.random()*100);
  12. arrg[i]=t;
  13. }
  14. Merger sort7 = new Merger();
  15. Date date12 = new Date();
  16. long a12 = date12.getTime();
  17. sort7.sort(arrg);
  18. Date date13 = new Date();
  19. long a13 = date13.getTime();
  20. System.out.println("归并排序用时:"+(a13-a12)+"毫秒");
  21. }

  22. }

  23. class Merger extends Sort{
  24. int[][] tdarr;//由于还不知道数组长度,故先声明一个二维数组,用途为存放数组数据
  25. //排序的方法
  26. public void sort(int arr[])
  27. {
  28. int j;//j控制的是二维
  29. tdarr = new int[arr.length][1];//方法的形参列表中引入了数组,即可实例化上面的声明的那个二维数组
  30. for(j=0;j<arr.length;j++)
  31. { tdarr[j][0] = arr[j]; }
  32. --j;
  33. while(tdarr[0].length<arr.length)
  34. {
  35. if(j%2==0){
  36. j/=2;
  37. int m;
  38. for(m=0;m<j;m++)
  39. { //将tdarr[m/2]指向归并后的数组的地址
  40. tdarr[m] = merge(tdarr[2*m],tdarr[2*m+1],
  41. tdarr[2*m].length,tdarr[2*m+1].length);
  42. }
  43. //将tdarr[m/2]指向归并后的数组的地址
  44. tdarr[m] = tdarr[2*m];
  45. }else{
  46. j/=2;
  47. j++;
  48. for(int m=0;m<j;m++)
  49. { //将tdarr[m/2]指向归并后的数组的地址
  50. tdarr[m] = merge(tdarr[2*m],tdarr[2*m+1],
  51. tdarr[2*m].length,tdarr[2*m+1].length);
  52. }
  53. j--;
  54. }
  55. }
  56. }
  57. //归并两个数组的方法,此方法逻辑较为复杂,请耐心品味
  58. public int[] merge(int arr0[],int arr1[],int x,int y){
  59. //int x、y分别表示数组arr0、arr1的长度,为什么不直接用arr0.length、arr1.length
  60. //是为了增强代码的可读性,以免看得云里雾里
  61. int low0 = 0,high0 = 0,low1 = 0,high1 = 0;
  62. //low0、high0、low1、high1分别表示的是数组arr0、arr1各自的低位指针、高位指针
  63. int[] _arr = new int[x+y];//数组_arr用来存放归并两个子数组后的总数组
  64. while(high0<x||high1<y){
  65. while(high0<x&&arr0[high0]<=arr1[low1])
  66. { high0++; }
  67. if(high1!=y&&high0==x)
  68. {
  69. for(int i=low0;i<high0;i++)
  70. { _arr[low1+i] = arr0[i]; }
  71. for(int i=low1;i<y;i++)
  72. {
  73. high1++;
  74. _arr[high0+i] = arr1[i];
  75. }
  76. }//此处即已排完
  77. else if(high0<x)
  78. {
  79. for(int i=low0;i<high0;i++)
  80. { _arr[low1+i] = arr0[i]; }
  81. low0 = high0;
  82. }
  83. while(high1<y&&arr0[low0]>=arr1[high1])
  84. { high1++; }
  85. if(high0!=x&&high1==y)
  86. {
  87. for(int i=low1;i<high1;i++)
  88. { _arr[low0+i] = arr1[i]; }
  89. for(int i=low0;i<x;i++)
  90. {
  91. high0++;
  92. _arr[high1+i] = arr0[i];
  93. }
  94. }//此处即已排完
  95. else if(high1<y)
  96. {
  97. for(int i=low1;i<high1;i++)
  98. { _arr[low0+i] = arr1[i]; }
  99. low1 = high1;
  100. }
  101. }
  102. return _arr;//返回归并后的数组,为什么不采用返回类型void,然后后arr0=_arr.
  103. } //请自行了解值传递与引用传递的区别
  104. //打印的方法
  105. public void show()
  106. {
  107. for(int i=0;i<tdarr[0].length;i++)
  108. {
  109. System.out.print(tdarr[0][i]+" ");
  110. }
  111. }
  112. }</P>
  113. <P> </P>
  114. <P>/***附上测试结果</P>
  115. <P>*归并排序用时:45毫秒</P>
  116. <P>*/</P>
复制代码

P[0[%1XMKCCBL6MKN[LL02T.jpg (107.54 KB, 下载次数: 0)

算法描述

算法描述

作者: woshishei121    时间: 2015-3-2 15:56
学习了,感谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2