归并排序(MergeSort)-java

1、介绍

该算法采用分治策略,将问题分成一些小的问题后递归求解,然后再将每个分支的结果进行整合。使用空间换时间的方式完成

2、实现思路

将一个待排序序列从中间进行递归分割,然后将每一端的数据在进行分割,拆分到一定程度后再将左右两端的元素按照大小依次放入临时数组当中,最后将临时数组中的数据拷贝到原数组中

3、代码实现

package com.lyw.review510;

import java.util.Arrays;

// 归并排序
public class MergeSort {

  public static void main(String[] args) {
    int[] arr = {4, 1, 6, 8, 9, 0};
    int[] temp = new int[arr.length];
    mergeSort(arr, 0, arr.length - 1, temp);
    System.out.println(Arrays.toString(arr));
  }

  // 分加合的方法
  public static void mergeSort(int[] arr, int left, int right, int[] temp) {

    if (left < right) {
      // 中间变量
      int mid = (left + right) / 2;
      // 中间变量的左边序列进行再拆分
      mergeSort(arr, left, mid, temp);
      // 然后拆分中间变量的右边的序列
      mergeSort(arr, mid + 1, right, temp);
      // 拆分完左边的和右边的数据之后然后合并当前元素
      merge(arr, left, mid, right, temp);
    }
  }


  // 合并两个序列的数据 -> 临时数组temp上
  public static void merge(int[] arr, int left, int mid, int right, int[] temp) {

    int i = left; // 记录左边序列的开始索引
    int j = mid + 1; // 右边序列的开始索引
    int t = 0; // 记录临时数组元素的下标

    // 1、将左边的序列和右边的序列依次比较插入临时数组中,直到左右两边有序列表,有一个先处理完毕为止
    // 满足这个条件说明左右两端的序列没有一端的数据填充完
    while (i <= mid && j <= right) {

      // 记得别忘记移动索引
      // 如果左边的元素小于右边的元素,就将左边的元素先添加到临时数组中
      if (arr[i] < arr[j]) {
        temp[t] = arr[i];
        t++;
        i++;
      } else { // 反之说明右边的数据小于等于左边的数据
        temp[t] = arr[j];
        j++;
        t++;
      }

    }

    // 2、将两端数组中其中一个剩余的数组按照顺序添加到临时表中
    // 将左边的序列剩余的数组依次拷贝到临时数组中
    while(i <= mid) {
      temp[t] = arr[i];
      t++;
      i++;
    }

    // 将有边的序列剩余的数组依次拷贝到临时数组中
    while(j <= right) {
      temp[t] = arr[j];
      t++;
      j++;
    }

    // 3、最后将数组中的数据拷贝到原数组中
    t = 0; // 初始化临时数组中的下标元素,方便拷贝
    int tempLeft = left; // 用作记录原数组中的下标
    while(tempLeft <= right) {
      arr[tempLeft] = temp[t];
      t++;
      tempLeft++;
    }
  }
}

仅供参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种基于分治思想的排序算法。非递归实现的归并排序可以通过迭代来完成。下面是一个使用 Java 实现的归并排序非递归版本的示例代码: ```java public class MergeSort { public static void mergeSort(int[] arr) { if (arr == null || arr.length <= 1) { return; } int n = arr.length; int[] temp = new int[n]; int size = 1; // 子数组的大小,初始为1 while (size < n) { mergePass(arr, temp, size, n); // 执行一趟归并排序 size *= 2; // 子数组大小翻倍 } } private static void mergePass(int[] arr, int[] temp, int size, int n) { int i = 0; while (i + 2 * size <= n) { merge(arr, temp, i, i + size - 1, i + 2 * size - 1); // 归并相邻的两个子数组 i += 2 * size; } if (i + size < n) { merge(arr, temp, i, i + size - 1, n - 1); // 归并剩余的两个子数组 } } private static void merge(int[] arr, int[] temp, int left, int mid, int right) { int i = left; // 左边子数组的起始位置 int j = mid + 1; // 右边子数组的起始位置 int k = left; // 归并后数组的起始位置 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = left; m <= right; m++) { arr[m] = temp[m]; } } public static void main(String[] args) { int[] arr = {5, 2, 8, 4, 9, 1}; System.out.println("Before sorting:"); for (int num : arr) { System.out.print(num + " "); } mergeSort(arr); System.out.println("\nAfter sorting:"); for (int num : arr) { System.out.print(num + " "); } } } ``` 这个示例代码中,`mergeSort` 方法用于调用非递归归并排序算法。`mergePass` 方法用于执行一趟归并排序,`merge` 方法用于归并两个子数组。 希望这个示例代码能够帮助你理解归并排序的非递归实现。如有疑问,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值