千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆

java归并排序非递归的方法

匿名提问者 2023-10-18 14:18:01

java归并排序非递归的方法

我要提问

推荐答案

  使用循环队列,这个方法使用循环队列来模拟递归调用的栈,以实现归并排序的非递归版本。首先,我们将数组划分为单个元素的子数组,然后逐步合并它们。

千锋教育

  实现步骤:

  初始化一个循环队列,并将每个单个元素的子数组添加到队列中。

  从队列中依次取出两个子数组,合并它们,并将结果放回队列。

  重复步骤2,直到队列中只剩下一个子数组。

  import java.util.LinkedList;

  import java.util.Queue;

  public class NonRecursiveMergeSort {

  public static void merge(int[] arr, int left, int mid, int right) {

  int n1 = mid - left + 1;

  int n2 = right - mid;

  int[] L = new int[n1];

  int[] R = new int[n2];

  for (int i = 0; i < n1; i++) {

  L[i] = arr[left + i];

  }

  for (int j = 0; j < n2; j++) {

  R[j] = arr[mid + 1 + j];

  }

  int i = 0, j = 0, k = left;

  while (i < n1 && j < n2) {

  if (L[i] <= R[j]) {

  arr[k] = L[i];

  i++;

  } else {

  arr[k] = R[j];

  j++;

  }

  k++;

  }

  while (i < n1) {

  arr[k] = L[i];

  i++;

  k++;

  }

  while (j < n2) {

  arr[k] = R[j];

  j++;

  k++;

  }

  }

  public static void nonRecursiveMergeSort(int[] arr) {

  int n = arr.length;

  for (int currentSize = 1; currentSize < n; currentSize *= 2) {

  for (int left = 0; left < n - 1; left += 2 * currentSize) {

  int mid = Math.min(left + currentSize - 1, n - 1);

  int right = Math.min(left + 2 * currentSize - 1, n - 1);

  merge(arr, left, mid, right);

  }

  }

  }

  public static void main(String[] args) {

  int[] arr = {12, 11, 13, 5, 6, 7};

  nonRecursiveMergeSort(arr);

  System.out.println("Sorted array:");

  for (int num : arr) {

  System.out.print(num + " ");

  }

  }

  }

   这是一种使用循环队列的非递归归并排序实现方法。它将数组划分为单个元素的子数组,然后逐步合并它们,直到排序完成。

猜你喜欢LIKE

java文件写入覆盖的方法

2023-10-18

java类如何获取项目相对路径

2023-10-18

java写入文件拒绝访问怎么办

2023-10-18

最新文章NEW

java归并排序非递归的方法

2023-10-18

python3传参有哪些步骤

2023-10-18

python3 with用法怎么操作

2023-10-18