算法学习之归并排序

原理

分支算法处理数组,每次分成两组,并将每一组看做有序数组,之后合并到一个数组中

思路

1.从数组中间值分为左右两部分,进行递归直到每组中只有一个元素时,这时我们可以将其看做已经排好的有序数组(其实就是一个数没有顺序罢了)

2.新创建一个数组,遍历两个有序数组,将其按顺序放入新数组中

3.将新的数组返回,返回上一层递归

代码

public class MergeSort {
    /**
     * 归并排序: 将数组按递归一直分成两组,之后将所有数组看做顺序数组进行合并
     * @param arr   需要排序的原数组
     * @param left  分组的当前数组的起始索引
     * @param right 分组的当前数组的结束索引
     * @param temp  辅助数组
     * @return
     */
    public static int[] margeSort(int arr[] , int left  , int right , int temp[]){
        if (left >= right){
            return arr;
        }
        // mid是当前有序数组的中间值
        int mid = (left+right)/2;
        // 分成两组,第一组从left到mid,第二组从mid+1到right
        margeSort(arr,left,mid,temp);
        margeSort(arr,mid+1,right,temp);
        int t = 0;
        int i = left;
        int j = mid+1;
        System.out.println("left = " + left + " right = " + right);
        System.out.println("i = " + i + " j = " + j);
        // 将两个有序数组按序存放到temp中,i是第一个数组的起始索引,j是第二个数组的起始索引
        while (i<=mid && j<=right){
            // 按照从小到大的顺序进行排序
            // 如果左边数组的数小于右边数组的值,则放入左边的值,左边下标向右移
            while (i<=mid&&arr[i]<=arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }
            // 反之,则放入右边的值,右边的下标向右移
            while (j<=right&&arr[i]>=arr[j]){
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        // 将数组中剩余的数据填入temp中
        while (i<=mid){
            temp[t] = arr[i];
            t++;
            i++;
        }
        while (j<=right){
            temp[t] = arr[j];
            t++;
            j++;
        }

        // 现在temp其实就是两个数组合并好之后的情况,所以将temp填回原数组
        int tempLeft = left;
        t = 0;
        while (tempLeft <= right){
            arr[tempLeft] = temp[t];
            tempLeft++;
            t++;
        }
        for (int l = 0 ; l < arr.length ; l++){
            System.out.print(arr[l] + " ");
        }
        System.out.println();
        return arr;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数组长度: ");
        int n = scanner.nextInt();
        int arr[] = new int[n];
        System.out.println("请输入数组元素: ");
        for (int i = 0 ; i < n ; i++){
            arr[i] = scanner.nextInt();
        }
        int []temp = new int[n];

        arr = margeSort(arr,0,arr.length-1,temp);
        for (int i = 0 ; i < arr.length ; i++){
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值