排序:归并排序

目录

一.归并排序介绍:

二.归并排序的基本步骤:

三.归并排序的java代码实现:

1.非递归

2.递归

 总结:


一.归并排序介绍:

        归并排序,也称为 (MERGE-SORT),是一种基于分治法(Divide and Conquer)的排序算法。该算法的主要思想是将已有序的子序列合并,以达到完全有序的序列。

二.归并排序的基本步骤:

  1. 分解(Divide):将待排序的原始数组分解成若干个长度为1的子数组,这时候每个子数组都是有序的。然后将这些子数组两两配对,进行合并。

  2. 合并(Merge):对于每次合并,比较两个子数组的首元素,将较小的元素复制到合并后的数组中,然后将较小元素的子数组向后移动一位,继续比较下一个元素。如果两个元素相等,可以选择将其中一个复制到合并后的数组中,以保持元素的相对顺序。重复这个过程,直到其中一个子数组的所有元素都被复制到合并后的数组中。

  3. 递归(Recur):对于合并后的数组,如果它仍然大于1个元素,那么它可以继续被分解成更小的子数组,然后重复分解和合并的过程,直到所有子数组的长度都为1。

  4. 完成(Complete):当所有子数组都合并回原始数组时,原始数组就变成了一个有序的数组。这时候,整个归并排序过程结束。

三.归并排序的java代码实现:

        归并排序的实现分为递归和非递归两种。递归实现中,将待排序序列不断分为两个等长的子序列,分别对子序列进行排序,然后将排序结果合并,直到整个序列有序。非递归实现则是通过循环来进行两两归并。

1.非递归

public class MergeSort {

    public static void mergeSort(int[] arr) {
        int n = arr.length;
        for (int size = 1; size < n; size *= 2) {
            for (int left = 0; left < n - 1; left += 2 * size) {
                int mid = Math.min(left + size, n);
                int right = Math.min(left + 2 * size, n);
                merge(arr, left, mid, right);
            }
        }
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        int n1 = mid - left;
        int n2 = right - mid;

        int[] leftArray = new int[n1];
        int[] rightArray = new int[n2];

        for (int i = 0; i < n1; ++i) {
            leftArray[i] = arr[left + i];
        }
        for (int j = 0; j < n2; ++j) {
            rightArray[j] = arr[mid + 1 + j];
        }

        int i = 0, j = 0;
        int k = left;
        while (i < n1 && j < n2) {
            if (leftArray[i] <= rightArray[j]) {
                arr[k] = leftArray[i];
                i++;
            } else {
                arr[k] = rightArray[j];
                j++;
            }
            k++;
        }

        while (i < n1) {
            arr[k] = leftArray[i];
            i++;
            k++;
        }

        while (j < n2) {
            arr[k] = rightArray[j];
            j++;
            k++;
        }
    }

    public static void main(String[] args) {
        int[] arr = {7,3,5,1,6,4,8,2};
        mergeSort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

接下来我们看一看递归的代码

2.递归

public class MergeSort {
    public static void main(String[] args) {
        int[] arr={7,3,5,1,6,4,8,2};
        sort(arr);
        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
    public static void sort(int[] arr){
        sortSection(arr,0, arr.length-1);
    }
    private static void sortSection(int[] arr,int start,int end){
        if (start==end){
            return;
        }
        int mid=(end+start)/2;
        sortSection(arr,start,mid);
        sortSection(arr,mid+1,end);
        merge(arr,start,mid+1,end);
    }
    private static void merge(int[] arr,int start,int start2,int end){
        int len=start2-start;
        int[] temp=new int[len];
        System.arraycopy(arr,start,temp,0,len);

        int p=0;
        int q=start2;
        for (int i = start; i <=end; i++) {
            if(temp[p]<arr[q]){
                arr[i]=temp[p];
                p++;
                if (p==len){
                    break;
                }
            }else {
                arr[i]=arr[q];
                q++;
                if (q>end){
                    while (p<len){
                        i++;
                        arr[i]=temp[p];
                        p++;
                    }
                }
            }
        }
    }
}

 总结:

        归并排序在计算机科学中占据重要地位,在数据库管理、数据分析、信息检索等领域有广泛应用。现实生活中,我们可以根据数据特点和需求选择合适的排序方法,以提高编程效率

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值