java二路归并排序算法_二路归并排序的java实现

参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序;归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序;

public classmergesortutil {public static voidmain(String[] args) {//TODO Auto-generated method stub

int[] a = new int[] { 11,9,7,5,3,1,12,10,8,6,4,2};int[] tmp = new int[a.length];

mergesort(a,0,a.length-1,tmp);

}private static void mergearray(int[] array, int start, int middle, int end,int[] tmp) {int first =start;int second = middle + 1;int index =start;while ((first <= middle) && (second <=end)) {if (array[first] >=array[second])

tmp[index++] = array[second++];elsetmp[index++] = array[first++];

}while (first <=middle)

tmp[index++] = array[first++];while (second <=end)

tmp[index++] = array[second++];for (first = start; first <= end; first++)

array[first]=tmp[first];

System.out.println("merge is "+Arrays.toString(array));

}public static void mergesort(int[] array, int start, int end,int[] tmp) {if (start >=end)return;int middle = ((end + start) >> 1);

mergesort(array, start, middle,tmp);//递归划分左边的数组

mergesort(array, middle + 1, end,tmp);//递归划分右边的数组

mergearray(array, start, middle, end,tmp);//对有序的两个数组进行合并成一个有序的数组

}

}

程序调试输出如下

merge is [9, 11, 7, 5, 3, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 5, 3, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 3, 5, 1, 12, 10, 8, 6, 4, 2]

merge is [7, 9, 11, 1, 3, 5, 12, 10, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 12, 10, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 10, 12, 8, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 6, 4, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 4, 6, 2]

merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 2, 4, 6]

merge is [1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12]

merge is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

调试过程输出结果有助于更好的理解排序过程,整个排序在数组划分到最小长度后不断进行局部排序和局部合并排序,最终合并为全数组。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值