归并排序-java实现

  
  
  1. /**
  2. * 归并排序:采用分治法
  3. *
  4. * @author timmy1 归并排序是将一个无序的元素序列,先进行分解成只有一个数据元素的序列. 再将两个相邻的元素序列进行合并,合并后还要是有序的.
  5. */
  6. public class MergeSort {
  7. /**
  8. * 将数组进行分解,分解成只有一个元素,热后合并
  9. *
  10. * @param a
  11. * @param left
  12. * @param right
  13. * @param temp
  14. */
  15. private void mergeSort(int[] a, int left, int right, int[] temp) {
  16. if (left < right) {
  17. int mid = (left + right) / 2;
  18. mergeSort(a, left, mid, temp);
  19. mergeSort(a, mid + 1, right, temp);
  20. // 递归方法到这一步,最后会剩下两个元素,将这两个元素进行合并.
  21. merge(a, left, mid, right, temp);
  22. }
  23. }
  24. /**
  25. * 将数组中的left-mid元素和mid+1-right两个序列元素合并到a数组中
  26. *
  27. * @param a
  28. * @param left
  29. * @param mid
  30. * @param right
  31. * @param temp
  32. */
  33. private void merge(int[] a, int left, int mid, int right, int[] temp) {
  34. // 先将两个数列中的元素放到一个临时的数组中保存起来,然后再移动到a数组中去
  35. // int[] temp = new int[a.length];
  36. int k = 0;
  37. int l = left, r = right;
  38. int m = mid, n = mid + 1;
  39. // 从两个不同的序列中从开头的第一个取元素,进行比较后放到临时数组中
  40. while (l <= m && n <= r) {
  41. if (a[l] < a[n]) {
  42. temp[k++] = a[l++];
  43. } else {
  44. temp[k++] = a[n++];
  45. }
  46. }
  47. // 其中的一个序列中的元素全部获取完毕,将另外一个序列的元素获取出来
  48. while (l <= m) {
  49. temp[k++] = a[l++];
  50. }
  51. while (n <= r) {
  52. temp[k++] = a[n++];
  53. }
  54. // 将临时数组中的元素复制到数组a中
  55. for (int q = 0; q < k; q++) {
  56. a[left++] = temp[q];
  57. }
  58. }
  59. public static void main(String[] args) {
  60. PrintUtil.print("归并排序");
  61. int[] a = { 10, 8, 3, 9, 47, 12, 14, 8, 5, 0, 2 };
  62. PrintUtil.printArray(a, PrintUtil.HORIZONTAL);
  63. MergeSort sort = new MergeSort();
  64. sort.mergeSort(a, 0, a.length - 1, new int[a.length]);
  65. PrintUtil.printArray(a, PrintUtil.HORIZONTAL);
  66. }
  67. }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值