首页 > 其他分享 >归并排序

归并排序

时间:2022-09-28 21:45:11浏览次数:48  
标签:tmp 归并 nums int void len 排序

归并排序

时间复杂度为O(nlog(n)),稳定排序,需要额外空间O(n),原地归并没看

归并排序的两种方式

自顶向下

先向下分治成规模为2的子问题,然后向上进行merge;

自底向上

在底部先进行规模为2的归并,然后处理规模为4,8...的问题向上归并

代码示例

merge方法用的同一个,额外空间用tmp;

package leet;

import org.junit.Test;

import java.util.Arrays;

/**
 * @ClassName:MergeSort
 * @Description:TODO
 * @author:zgw
 * @date:2022/9/28 21:09
 */
public class MergeSortTest {
    int[] tmp;
    @Test
    public void test() {
        int[] nums = new int[]{3, 2, 1, 0};
        System.out.println(Arrays.toString(nums));
        // 迭代方式归并 自底向上
        iterationSort(nums);
        System.out.println(Arrays.toString(nums));
    }

    @Test
    public void test2() {
        int[] nums = new int[]{3, 2, 1, 0};
        System.out.println(Arrays.toString(nums));
        // 递归归并 自顶向下
        recursionSort(nums);
        System.out.println(Arrays.toString(nums));
    }

    private void iterationSort(int[] nums) {
        int n = nums.length;
        tmp = new int[n];
        for (int len = 1; len < n; len *= 2) {
            for (int i = 0; i < n + 1 - len; i += 2 * len) {
                merge(nums, i, i + len, Math.min(n, i + 2 * len - 1));
            }
        }
    }

    private void recursionSort(int[] nums) {
        int n = nums.length;
        tmp = new int[n];
        doRecursionSort(nums, 0, n-1);
    }

    private void doRecursionSort(int[] nums, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = (left + right) / 2;
        doRecursionSort(nums, left, mid);
        doRecursionSort(nums, mid + 1, right);
        merge(nums, left, mid + 1, right);
    }

    private void merge(int[] nums, int leftStart, int rightStart, int rightEnd) {
        int l = leftStart, r = rightStart;
        int k = 0;
        while(l < rightStart || r <= rightEnd) {
            if (l >= rightStart) {
                tmp[k++] = nums[r++];
            } else if (r > rightEnd) {
                tmp[k++] = nums[l++];
            } else if (nums[l] <= nums[r]) {
                tmp[k++] = nums[l++];
            } else {
                tmp[k++] = nums[r++];
            }
        }

        for (int i = 0; i < k; i++) {
            nums[leftStart + i] = tmp[i];
        }
    }
}

标签:tmp,归并,nums,int,void,len,排序
From: https://www.cnblogs.com/beichuang/p/16739665.html

相关文章

  • 荷兰国旗问题与快速排序算法
    荷兰国旗问题与快速排序算法作者:Grey原文地址:博客园:荷兰国旗问题与快速排序算法CSDN:荷兰国旗问题与快速排序算法荷兰国旗问题问题描述给定一个整数数组,给定一个值K......
  • 16 -- 排序算法之插入排序
    算法介绍:插入排序属于内部排序法,时对于待排序的元素以插入的方式找到改元素的适当位置,以达到排序的目的。【类似于生活中的斗地主游戏,每抓起一张牌按照便把改张牌按照指定......
  • 排序
    Learningtorank指标介绍MAP(MeanAveragePrecision):假设有两个主题,主题1有4个相关网页,主题2有5个相关网页。某系统对于主题1检索出4个相关网页,其rank分别为1,2,4,......
  • csp模拟13[排序,Xorum, 有趣的区间问题,无聊的卡牌问题]
    排序对于这个题,它真的很妙,我们可以先考虑一下(如果\(a\)是排列)暴力怎么打。考虑两个数,他们互为逆序对,如果交换它们两个,如何让影响降到最小?那就是在他俩交换之后,他......
  • 1、python 基础知识-文件编号排序及指定后缀名文件删除
    问题描述:需要对一些文件进行删除和存在一对一的文件保存(1)自动删除指定文件后缀名文件:importsyscurrDir=sys.path[0]importosdefremoveFile(dir,postfix):ifos.pat......
  • 498排序查询和499聚合函数
    排序查询语法:orderby子句orderby排序字段一,排序方式一,排序字段二,排序方式二SELECT*FROMstudentORDERBYMATHASC;SELECT*FROMstudentORDERBYMATHDES......
  • 选择排序
    以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列: 初始序列:{49276597761238}第1趟:12与49交换:12{276597764938}第2趟:27不动:12......
  • java算法学习——选择排序算法
    研究生生活开始后,充分认识到算法的重要性,开始重拾java算法——视频参照哔哩哔哩左神——https://www.bilibili.com/video/BV13g41157hK/?p=4&spm_id_from=333.880.my_hist......
  • 19. 排序和搜索功能
    1.前言NumPy提供了多种排序函数,这些排序函数可以实现不同的排序算法。排序算法特征主要体现在以下四个方面:执行速度,最坏情况下的复杂度,所需的工作空间以及算法的稳定性......
  • 深入剖析堆原理与堆排序
    堆的介绍完全二叉树:完全二叉树是满二叉树去除最后N个节点之后得到的树(\(N\geq0,N\inN^*\))大根堆:节点的父亲节点比自身节点大,比如根节点的值为\(8\),比其子节点\(7\)......