专业的JAVA编程教程与资源

网站首页 > java教程 正文

看动图学算法(七):归并排序的原理和Java讲解

temp10 2025-05-27 17:36:34 java教程 7 ℃ 0 评论

归并排序(Merge Sort)是常见的一种排序算法,具有时间复杂度稳定、效率高等优点。

一、算法原理

归并排序是一种使用分治策略实现的排序算法,其主要思路是将一个待排序的序列不断分割成小的子序列,直到每个子序列只包含一个元素,然后合并相邻的子序列,最终得到一个完全有序的序列。

看动图学算法(七):归并排序的原理和Java讲解

归并排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。这个时间复杂度并不是最优解,但是归并排序的实际运行速度比较快,尤其当数据量很大时。

归并排序的空间复杂度为O(n),其中n为待排序序列的长度。由于归并排序需要一个辅助数组来合并子序列,因此其空间复杂度比较高。

1、步骤

下面我们以升序排列为例,对归并排序的具体实现进行阐述:

将待排序序列分割。将待排序序列按照二分法进行分割,得到两个子序列;

递归分割子序列。对于左右两个子序列分别进行递归处理,重复步骤①,直到不能再分割为止;

合并子序列。将两个有序的子序列合并成一个有序的序列,直到最终合并为一个完全有序的序列。

2、示例

下面给出一个包含10个元素的数组进行归并排序的示例,以便更好地理解算法原理:

二、Java实现代码示例

public class MergeSort {
    // 归并排序方法(递归)
    public static void mergeSort(int[] arr, int left, int right){
        if (left < right) {
          // 找中点
          int mid = (left + right) / 2;
          // 左半部分递归排序
          mergeSort(arr, left, mid);
          // 右半部分递归排序
          mergeSort(arr, mid + 1, right);
          // 归并排序后的两个有序子数组
          merge(arr, left, mid, right);
        }
    }

  // 归并排序辅助方法
  public static void merge(int[] arr, int left, int mid, int right){
      // 创建临时数组
      int[] temp = new int[arr.length];
      // i指向左半部分元素的起始位置,j指向右半部分元素的起始位置,k指向temp数组的起始位置
      int i = left;
      int j = mid + 1;
      int k = left;
      // 比较左右部分元素大小,取最小值放入temp数组中
      while(i <= mid && j <= right) {
          if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
          } else {
            temp[k++] = arr[j++];
          }
      }
      // 将剩余的左半部分元素依次放入temp数组中
      while(i <= mid){
        temp[k++] = arr[i++];
      }
      // 将剩余的右半部分元素依次放入temp数组中
      while(j <= right){
        temp[k++] = arr[j++];
      }
      // 将temp数组中排好序的元素复制到原数组中
      for (int s = left; s <= right; s++) {
        arr[s] = temp[s];
      }
  }

  // 主函数
  public static void main(String[] args){
    // 待排序数组
    int[] arr = {38, 27, 43, 3, 9, 42, 10};
    // 对数组进行归并排序
    mergeSort(arr, 0, arr.length - 1);
    // 输出排序结果
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + " ");
    }
  }
}

在代码实现中,我们利用递归的思想不断将待排序序列分割成更小的子序列。mergeSort()方法用于递归分割子序列,merge()方法用于合并子序列,实现过程中利用了额外的数组temp进行辅助排序。

三、动图演示效果

在动图中,首先将数组每个元素拆分成大小为1的分区,用不同颜色表示每个分区,然后递归合并相邻分区,直到全部合并完毕。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表