排序算法:归并排序

1、核心思想

2、时间复杂度:O(n^2)

3、稳定性:稳定

4、空间复杂度:O(2n)

5、上代码:

private static int[] tempArray;

public static void main(String[] args) {
    int[] array = new int[]{9, 12, 92, 3, 0, 1, 23, 8, 20};
    mergeSort(array, 0, array.length-1);

    for(int i=0;i<array.length;i++){
        System.out.print(array[i]+" ");
    }
}

private static void mergeSort(int[] array, int left, int right){
    // 当left等于right后结束拆分
    if(left < right){
        // 根据left和right计算中间位置
        int middle = (right + left)/2;

        // 继续拆分左边
        mergeSort(array, left, middle);
        // 继续拆分右边
        mergeSort(array, middle+1, right);

        // 数据合并
        merge(array, left, middle, right);
    }
}

private static void merge(int[] array, int left, int middle, int right){
    tempArray = new int[right-left+1];

    // 左边第一个元素下标
    int index1 = left;
    // 右边第一个元素下标
    int index2 = middle + 1;
    // 临时数组待插入位置下标
    int loc = 0;

    // 判断当左边循环的元素不超过左边最后一个元素
    // 且右边循环的元素不超过右边最后一个元素
    while(index1 <= middle && index2 <= right){
        // 从左到右判断两边的元素

        // 当右边的元素小于左边的元素,插入右边的元素
        if(array[index2] < array[index1]){
            tempArray[loc] = array[index2];
            loc++;
            // 右边待判断的元素下标+1
            index2++;

            // 否则即左边的元素小于右边的元素,插入左边的元素
        }else{
            tempArray[loc] = array[index1];
            loc++;
            // 左边待判断的元素下标+1
            index1++;
        }
    }

    // 当右边元素已全部插入排序数组tempArray后
    // 左边如还有剩余元素,则将左边剩余元素依次插入到tempArray最后
    while(index1 <= middle){
        tempArray[loc++] = array[index1++];
    }

    // 当左边元素已全部插入排序数组tempArray后
    // 右边如还有剩余元素,则将右边剩余元素依次插入到tempArray最后
    while(index2 <= right){
        tempArray[loc++] = array[index2++];
    }

    // 将原数组left到right的数据替换为排序后临时数组tempArray的数据
    for(int i=left;i<=right;i++){
        array[i] = tempArray[i-left];
    }
}

6、打印结果:
0 1 3 8 9 12 20 23 92
Process finished with exit code 0




***看懂了喜欢的可以点个赞哦,后续还会出新的笔记分享,谢谢大家!
以上内容欢迎评论,欢迎指正。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值