JAVA_算法_归并排序

布满荆棘的人生 2022-09-23 12:47 215阅读 0赞

思想:

把一个大的数组细分成两个不同的数组, 循环这个过程。直到数组中的元素只有1或0个元素。

当数组中的只有两个元素时,比较两个元素的大小,前一个大于后一个就交换。

然后把细分成两个或一个元素的数组合并,合并的方法是从两个数组中每次取最前面的元素比较,每次都取一个小的放在新数组的前面,新数组的自变量++。这里要定义3个临时变量用于数组的交换。

重复上述方法直到合并所有元素。

————————————我是分割线——————————————

以下是代码:

  1. <span style="white-space:pre"> </span>public static void merge(int []arr,int left,int center,int right){
  2. int []ar=new int [arr.length];
  3. int mid=center+1;//why add one?数组中的mid就是在center的位置
  4. int third=left;
  5. int tmp=left;
  6. while(left<=center&&mid<=right){
  7. if(arr[left]<=arr[mid])
  8. ar[tmp++]=arr[left++];//k会不会越界?
  9. else
  10. ar[tmp++]=arr[mid++];
  11. }
  12. while(mid<=right){
  13. ar[tmp++]=arr[mid++];
  14. }
  15. while(left<=center){//
  16. ar[tmp++]=arr[left++];
  17. }
  18. while(third<=right){
  19. arr[third]=ar[third++];
  20. }
  21. }
  22. public static void binarysort(int []arr,int left,int right){
  23. if(left>=right)
  24. return ;
  25. int center=(left+right)/2;
  26. binarysort(arr,left,center);
  27. binarysort(arr,center+1,right);
  28. merge(arr,left,center,right);
  29. print(arr);
  30. }
  31. public static void print(int[] data) {
  32. for (int i = 0; i < data.length; i++) {
  33. System.out.print(data[i] + "\t");
  34. }
  35. System.out.println();
  36. }

以上是用到的三个方法

在merge中分别用left,tmp,third三个变量来定义数组中的位置。游标是数组中方法的第二个参数的值加一作为下标时的值。

如果左边的值不大于(小于等于)游标的值,新数组存储这个值。否则存储游标的值。

对比作为left和mid下标时的数组中的值的大小,谁小就存储谁。

当不满足条件时就是left>center或者mid>right时,当left>center时,表示左边的数组已经取完了。当mid>center时,表示右边的值都取完了。

无论是哪种情况,都会有另外一边的数组还没有完全取完。

于是我们用了两个while循环来把剩余的值给取完。

在第三个while循环中,我们的third终于排上了用场。用来对数组的重新复制,即把原数组中的值排序后给了新数组,排好序后新数组中的值再重新给原来的数组。

在binarysort方法中,第一个条件时为了结束循环。

两个递归函数是为了让left和center和right的值能得到确认,当left<right时就会返回空。那就会在调用这个函数的函数里面继续向下运行。第一个循环结束后

第一次对最左边的排序,接着对第二个数组排序,合并后。对第三个数组排序,对第四个数组排序后(不排)合并。这时候只有两个数组了。

再对这两个数组进行一次排序,然后排好了。

这样的排序方式简直是完美的排序。充满了排序时的美感。

平均运行次数是nlogn次。

对于底数10为例,log(10)k,k=100(n次方)n=1,2,3,4’’’’’’∞时,值却是+1+1+1+1+1’’’’’’’’’

因此这种排序方式充满了让人心里感到满足的美感。

在主函数中调用:binarysort(array,0,array.length-1); 就能进行一次完整的排序

Center

以上是排序的过程。

发表评论

表情:
评论列表 (有 0 条评论,215人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法——归并排序

    引言 归并排序可以使用递归或迭代的方式来实现,时间复杂度是都是 O(N \ logN)。 归并排序的核心是将待排序数组分组,可以整体二分,也可以设置步长迭代切分。归并排

    相关 JAVA_算法_归并排序

    思想: 把一个大的数组细分成两个不同的数组, 循环这个过程。直到数组中的元素只有1或0个元素。 当数组中的只有两个元素时,比较两个元素的大小,前一个大于后一个就交换。 然

    相关 排序算法-归并排序

    归并排序也是一个比较快速的排序算法,其思想是运用分治的思想,先对要排序的数进行分,每次从中间分成两部分,然后知道分成最小,然后在把他们合起来,边合起来边排序,最后有序,每次分的

    相关 归并排序算法——java

    什么是归并排序算法? 答:归并排序算法就是利用分治思想将数组分成两个小组A,B,再将A,B小组各自分成两个小组,依次类推,直到分出来的小组只有一个数据时,可以认为这个小组已经

    相关 排序算法归并排序

    一、前言     归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法(Divide and Conquer) 的一个非常典型的应用。 --------