Program work 12. Merge Sort in Java

本文介绍了Merge Sort算法,其时间复杂度为O(n log n),适用于大规模数据排序。通过合并两个已排序的部分来实现整体排序,算法在Java中实现,并通过随机生成的数组进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最好时间复杂度可达O(n) 

最差时间复杂度为O(n*logn)

平均时间复杂度为O(n*logn)

需要额外的O(n)空间


Pseudocode:

merge(arr, tmp, begin, end)
{
    if (begin < endl) {
        get middle
        mergeSort(arr, tmp, begin, middle);
        mergeSort(arr, tmp, middle, end);
        merge(arr, tmp, begin, middle, end);
    }
}

merge(arr, tmp, begin, middle, end)
{
    compare the two part of tmp: [begin, middle], (middle, end]
    lesser is inserted to the arr.
    copy the rest into the arr
}

Java:

package ncku.cdc.sorting;

import java.util.Random;

public class MergeSort {
  private int[] sequence;

  public MergeSort(int size, int range) {
    sequence = new int[size];
    Random rand = new Random();
    for (int i = 0; i < size; i++) {
      sequence[i] = rand.nextInt(range);
    }
  }

  public static void main(String[] args) {
    int size = Integer.valueOf(args[0]);
    int range = Integer.valueOf(args[1]);
    MergeSort merge = new MergeSort(size, range);

    System.out.println("before mergeSort:");
    SortingTools.validation(merge.getSequence(), 0);

    int[] tmp = new int[size + 1];
    merge.mergeSort(merge.getSequence(), tmp, 0, size - 1);

    System.out.println("after mergeSort:");
    SortingTools.validation(merge.getSequence(), 0);
  }

  public void mergeSort(int[] arr, int[] tmp, int begin, int end) {
    if (begin < end) {
      int middle = ((begin + end) >> 1);
      mergeSort(arr, tmp, begin, middle);
      mergeSort(arr, tmp, middle + 1, end);
      merge(arr, tmp, begin, middle, end);
    }
  }

  private void merge(int[] arr, int[] tmp, int begin, int middle, int end) {
    int i = begin;
    int j = middle + 1;
    int length = end - begin + 1;
    int k = begin;
    
    while (i <= middle && j <= end) {
      if (arr[i] < arr[j]) { tmp[k++] = arr[i++]; }
      else                 { tmp[k++] = arr[j++]; }
    }
    while (i <= middle) { tmp[k++] = arr[i++]; }
    while (j <= end)    { tmp[k++] = arr[j++]; }
    
    for (int idx = 0; idx < length; idx++, end--) {
      arr[end] = tmp[end];
    }
  }

  public int[] getSequence() {
    return sequence;
  }
}


程序输入: 35 200. 表示随机生成一个长度为35, 每个数字范围为[0, 200)的数组

程序输出:

before mergeSort:
148 44 2 47 33 89 11 131 104 123 188 159 112 139 73 148 15 139 142 94 65 41 191 19 188 141 59 98 122 67 190 56 180 164 106 
after mergeSort:
2 11 15 19 33 41 44 47 56 59 65 67 73 89 94 98 104 106 112 122 123 131 139 139 141 142 148 148 159 164 180 188 188 190 191 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值