当前位置:   article > 正文

归并排序(Java代码实现)_java归并排序算法代码

java归并排序算法代码

基本思想: 

        将两个或两个以上的有序表合并成一个有序表的过程。常用的归并为2-路归并,就是将两个有序表合为一个有序表。

过程:

        先来看一张示意图:

        431202bf10de4455b4aee46c1786215f.webp

可以看出,归并排序分为分解和合并两个步骤。

分解就是将原数组分解成只有一个数的数组。

合并就是将相邻两个数组进行排序合并。

代码实现:

  1. import java.util.Arrays;
  2. public class MergingSort {
  3. public static void main(String[] args) {
  4. int[] a={1,6,2,8,0,3,4,5,7};
  5. Sort(a);
  6. }
  7. private static void Sort(int[] s){
  8. int len = s.length;
  9. int[] temp = new int[len];
  10. Merge(s,0,len-1,temp);
  11. System.out.println(Arrays.toString(s));
  12. }
  13. private static void Merge(int[] s,int low,int high,int[] temp){
  14. if(low<high){//递归结束条件:分解直到数组长度不小于1
  15. //递归分解
  16. int mid=(low+high)/2;
  17. Merge(s, low, mid, temp);//左子数组
  18. Merge(s, mid+1, high, temp);//右子数组
  19. if (s[mid]>s[mid+1]) {//如果左子数组最大的数都不大于右子数组最小数,数组已经有序,不需要进行排序
  20. //将无序数组赋给temp
  21. for (int i = low; i <= high; i++) {
  22. temp[i] = s[i];
  23. }
  24. //给无序数组排序,并赋给原数组。
  25. int i = low;//左子数组起点
  26. int j = mid + 1;//右子数组起点
  27. for (int k = low; k <= high; k++) {//k为原数组赋值点
  28. if (i == mid + 1) {//如果i下标已经到了右子数组起点,说明左子数组已经比较完毕
  29. s[k] = temp[j];//只需要将右子数组剩下的全部值赋给原数组即可
  30. j++;//j标签向前移动
  31. } else if (j == high + 1) {//同上
  32. s[k] = temp[i];
  33. i++;
  34. } else if (temp[i] < temp[j]) {//如果左子数组最小值[i]小于右子数组最小值[j]
  35. s[k] = temp[i];//将[i]作为两个子数组中的最小值赋给原数组
  36. i++;//i下标向前移动
  37. } else {//同上
  38. s[k] = temp[j];
  39. j++;
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }

结果:

01c19cebe66548d49273e198be87ccf1.png

时间复杂度:gif.latex?O%28nlog_%7B2%7Dn%29

空间复杂度:gif.latex?O%28n%29

算法特点:

        (1):稳定排序。

        (2):可适用于大多数情况的排序。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/67040
推荐阅读
相关标签
  

闽ICP备14008679号