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

归并排序

时间:2024-04-21 15:44:47浏览次数:15  
标签:归并 int arr mid step static 排序 public

归并排序

左部分有序  --->  右部分有序  ---> 整体有序

查看代码
// https://leetcode.cn/problems/sort-an-array/

import java.util.Arrays;

class Solution {
    public static final int MAX_N = 100001;

    public static int[] help = new int[MAX_N];

    public int[] sortArray(int[] arr) {

        //mergeSort1(arr,0,arr.length-1);
        mergeSort2(arr);
        return arr;
    }

    // 递归版 N*logn
    public static void mergeSort1(int[] arr,int l,int r) {
        if (l == r) {
            return;
        }
        int mid = (l + r) / 2;
        mergeSort1(arr,0,mid);
        mergeSort1(arr,mid + 1,r);
        merge(arr,l,mid,r);
    }
    // 非递归版
    public static void mergeSort2(int[] arr) {
        int n = arr.length;
        // O(logN)
        for (int l,r,m,step = 1;step < n;step *= 2) {
            // O(N)
            // 就是把, help数组 拷贝回原数组
            l = 0;
            while (l < n) {
                // 左部分右边界下标 = l + (step - 1)
                m = l + (step - 1);
                // 没有右边界, 直接break, 不需要merge
                if (m + 1 >= n) {
                    break;
                }
                // 右部分左边界下标 = m + 1;
                // 右部分右边界下标 = Math.min(l + (step * 2) - 1,n - 1)
                r = Math.min(l + (step * 2) - 1,n - 1);
                merge(arr,l,m,r);
                l = r + 1;
            }
        }
    }

    // O(N)
    private static void merge(int[] arr,int l,int mid,int r) {
        int a = l;
        int b = mid + 1;
        int i = l;
        while (a <= mid && b <= r) {
            help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++];
        }
        while (a <= mid) {
            help[i++] = arr[a++];
        }
        while (b <= r) {
            help[i++] = arr[b++];
        }
        for (i = l;i <= r;i++) {
            arr[i] = help[i];
        }
    }

    public static void main(String[] args) {
        int[] arr = {6,2,3,3,4,6,9,3,1};
        mergeSort2(arr);
        System.out.println(Arrays.toString(arr));
    }
}

递归版, 时间复杂度分析:

T(n) = 2 * T(n/2) + O(n^1)

a = 2, b = 2, c= 1

根据master公式, 时间复杂度为 O(n * logn), 有help辅助数组, 空间复杂度为O(N)

 

标签:归并,int,arr,mid,step,static,排序,public
From: https://www.cnblogs.com/xumu7/p/18147477

相关文章

  • 说说常见的排序算法有哪些?区别?
    一、是什么排序是程序开发中非常常见的操作,对一组任意的数据元素经过排序操作后,就可以把他们变成一组一定规则排序的有序序列排序算法属于算法中的一种,而且是覆盖范围极小的一种,彻底掌握排序算法对程序开发是有很大的帮助的对与排序算法的好坏衡量,主要是从时间复杂度、空间复......
  • 希尔排序
    #include<iostream>#include<cmath>usingnamespacestd;intmain(){intn;cin>>n;inta[n+5];for(inti=0;i<n;i++){cin>>a[i];}for(doublei=n;i>1;){i=round(i/2);for(i......
  • 希尔排序
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ stringa="liuyixing"; for(doublei=9;i>1;){ i=round(i/2); for(intj=0;j+i<9;j++){ if(a[j]>a[j+(int)i]){ swap(a[j],a[j+(int)i]); } } } for(inti=0;i<......
  • JZ33 二叉排序树的后序遍历序列
    classSolution{public://判断该数组是不是某二叉搜索树的后序遍历的结果。//如果是则返回true,否则返回false//注意传入参数是一个int类型的vector容器boolVerifySquenceOfBST(vector<int>sequence){if(sequence.empty()) //二叉树......
  • el-table实现自定义排序事件
    说明在项目开发中,需求有时会需要通过调取接口去实现表格数据排序。实现要点在el-table-column中定义sortable="custom"属性在el-table中定义@sort-change="自定义排序事件"代码...<el-table:data="list"@sort-change="handleSort"ref="tableRef">......
  • LinkedHashMap排序
    importjava.util.LinkedHashMap;importjava.util.Map;importjava.util.TreeMap; publicclassSortLinkedHashMapByKey{publicstaticvoidmain(String[]args){//创建一个LinkedHashMapLinkedHashMap<Integer,String>linkedHashMap=newLinkedHashMap<......
  • JZ36二叉树排序树与双向链表
    /*structTreeNode{ intval; structTreeNode*left; structTreeNode*right; TreeNode(intx): val(x),left(NULL),right(NULL){ }};*/#include<cstddef>classSolution{public: TreeNode*ans=nullptr; //最终的链表 TreeNode*pre=nullptr; ......
  • 排序
    排序算法直接插入折半插入冒泡排序简单选择排序快速排序堆排序实现以及使用c++#include<iostream>#include<algorithm>#include<queue>usingnamespacestd;voidhalf_insert_sort(intnums[],intsize){ //将新数字插入到有序数组中 //使用折半查找寻找插入......
  • 06-排序 分页 过滤
    排序查询多条和全部才会用到排序排序关键字:ordering查询字符串查询字符串(QueryString)是指在URL中以问号(?)开始的部分,用于向服务器传递参数。它由一个或多个键值对组成,每个键值对之间用&符号分隔。例如,在以下URL中,查询字符串是?page=2&category=books:在django种如......
  • C++排序问题
    冒泡排序若得到一个从小到大的数组例如:3527481角标:1234567就是角标1和角标2比,若1大于2,就交换位置,然后角标2和角标3比,若2大于3,就交换位置第一趟:3254718第二趟:2345178以此类推。。。。点击查看代码#include<bits/stdc++.h>usingnamespaces......