归并排序递归实现、迭代实现(java)

本文详细介绍了如何使用Java实现归并排序,包括递归和迭代两种方式。首先,通过分治和递归思想分析了归并排序的基本原理,接着展示了递归实现的详细步骤和归并操作的代码。随后,转向迭代实现,同样进行了分析和具体实现的展示。
摘要由CSDN通过智能技术生成

递归实现

分析

归并排序:分治、递归思想

  • 将一个数组A分成左右两部分A1、A2,那么对A的排序可以分为以下两步
    1.将A1、A2分别排好序
    2.将A1、A2两个各自有序的数组合并成一个有序数组,这个过程叫做归并(merge)
    (分治思想)

  • 那么如何将A1、A2排好序呢?
    使用对A排序的方式对A1、A2分别排序即可
    (递归思想)

  • 用伪代码来表示:

      sort(A){
      	sort(A1);
      	sort(A2);
      	merge(A1,A2)
      }
    
实现

归并排序的实现:

    //任务:对数组进行递归排序
    public static void mergeSort(int[] arr){
   
        mergeSort(arr,0,arr.length-1);
    }
    //任务:归并排序的递归实现,实现arr[left,right]的有序
    public static void mergeSort(int[] arr,int left,int right){
   
        //优化点2:当数组比较小时,可以使用插入排序,效率更高。
        //if(right-left+1<16) insertSort(int[] arr,int left,int right);
        if(left>=right){
   
            return;
        }
        else{
   
            int center=(left+right)/2;//分开的左数组的最后一个下标
            
            mergeSort
归并排序是一种基于分治思想的排序算法。非递归实现归并排序可以通过迭代来完成。下面是一个使用 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、付费专栏及课程。

余额充值