首页 > 其他分享 >数据结构-归并排序

数据结构-归并排序

时间:2023-08-21 11:31:26浏览次数:46  
标签:... 归并 排序 int mid right 数组 数据结构 left


java实现归并排序算法

源代码

public class MergeSort extends DataCrol {
    // 合并两个已排好序的数组A[left...mid]和A[mid+1...right]
    void merge(int A[], int left, int mid, int right) {
        int len = right - left + 1;
        int[] temp = new int[len];// 辅助空间O(n)
        int index = 0;
        int i = left;                   // 前一数组的起始元素
        int j = mid + 1;                // 后一数组的起始元素
        while (i <= mid && j <= right) {
            temp[index++] = A[i] <= A[j] ? A[i++] : A[j++];  // 带等号保证归并排序的稳定性
        }
        while (i <= mid) {
            temp[index++] = A[i++];
        }
        while (j <= right) {
            temp[index++] = A[j++];
        }
        for (int k = 0; k < len; k++) {
            A[left++] = temp[k];
        }
    }

    // 递归实现的归并排序(自顶向下)
    void mergeSortRecursion(int A[], int left, int right) {
        if (left == right)    // 当待排序的序列长度为1时,递归开始回溯,进行merge操作
            return;
        int mid = (left + right) / 2;
        mergeSortRecursion(A, left, mid);
        mergeSortRecursion(A, mid + 1, right);
        merge(A, left, mid, right);
    }

    // 非递归(迭代)实现的归并排序(自底向上)
    void mergeSortIteration(int A[]) {
        int len = A.length;
        int left, mid, right;// 子数组索引,前一个为A[left...mid],后一个子数组为A[mid+1...right]
        for (int i = 1; i < len; i *= 2) {       // 子数组的大小i初始为1,每轮翻倍
            left = 0;
            while (left + i < len) {              // 后一个子数组存在(需要归并)
                mid = left + i - 1;
                right = mid + i < len ? mid + i : len - 1;// 后一个子数组大小可能不够
                merge(A, left, mid, right);
                left = right + 1;               // 前一个子数组索引向后移动
            }
        }
    }

    @Override
    public void sort(int[] array) {
//        mergeSortIteration(array);
        mergeSortRecursion(array, 0, array.length - 1);
    }

    public static void main(String[] args) {
        MergeSort mergeSort = new MergeSort();
        int[] array = DataCrol.createRandomArray(20);
        DataCrol.print(array);
        mergeSort.sort(array);
        DataCrol.print(array);
        mergeSort.timeTest(10000000);
    }
}


标签:...,归并,排序,int,mid,right,数组,数据结构,left
From: https://blog.51cto.com/u_10101161/7173112

相关文章

  • 数据结构与算法八股
    讲一讲插入排序讲一讲冒泡排序讲一讲快速排序讲一讲堆排序讲一讲归并排序 dpdp数组的定义及含义:dp[num1.length+1][num2.length+1],为什么要+1呢,因为我们要判断他与前面的关系涉及到i-1,所以遍历需要从1开始return的是什么如果初始化时候size+1了,那么最后一个下标就是size......
  • 【数据结构】排序 归并排序和基数排序
    1.归并排序归并排序中的"归并"的意义就是把多个有序表合并为一个新的有序表。算法思想:二路归并排序:初始情况下将长度为n的待排序表分为n个子表,则每个子表的长度为1,是有序的。每趟排序尽量将这些子表按位置相邻两两归并,重复直到合并为一个长度为n的有序表为止。具体实现:在归......
  • 选择排序
    排序#include<iostream>#include<algorithm>usingnamespacestd;inta[10010];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) { cin>>a[i]; } //使用选择排序进行排序 for(inti=1;i<=n;++i) { for(int......
  • sqlite 实现分页排序
    版本号MacOSAppleM1|Jdk17|Maven3.8.5|SpringBoot2.6.9|内嵌式Sqlite3.42.0.0Pageable使用方式findAll()importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;importorg.springframework.data.domain.Pageabl......
  • 「学习笔记」归并排序
    关于归并排序,百度百科是这样定义的:归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路......
  • 将三个组排序
    给定数组只含1、2、3三种数每次操作可以将一个数进行修改将数组修改成非递减顺序的最少次数1.暴力(笨比做法)枚举三种类型数分割的界限classSolution{public:intminimumOperations(vector<int>&nums){intres=INT_MAX;intn=nums.size();......
  • 考研数据结构——每日一题[希尔排序]
    shell_sort希尔排序//每组内的下标是等差数列//c++中的sort是快排+插排【当排序到<28时改为插入排序】voidshell_sort()//希尔排序【分组的插入排序】不稳定(间隔d的分为一组){for(intd=n/3;d;d=d==2?1:d/3)//特判2,等于2就用1,(最后要用1,而2时d/3=......
  • 数据结构学习记录(一)
    堆栈与队列一、知识要点1、堆栈堆栈的定义堆栈(Stack)是一种具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶(Top)的端点位置。通常把数据插入称为压入栈(Push),删除数据称为弹出栈(Pop)。在堆栈中,最后入栈的数据被最先弹出,所以堆栈也被称为后入先出。堆栈的抽象数据......
  • COMP3506/7505 算法与数据结构
    AssignmentOne–15%AlgorithmsandDataStructures–COMP3506/7505–Semester2,2023Due:3pmonFridaySeptember1st(week6)SummaryThemainobjectiveofthisassignmentistogetyourhandsdirtywithsomesimpledatastructuresandalgorithmstosolveb......
  • 归并,基数排序及排序分析
    归并,基数排序及排序分析归并排序将两个或两个以上的有序子序列"归并"为一个有序的序列.归并排序的演示归并需要logn趟如何将两个有序序列合成一个有序序列?使用前面学的两个线性表的合并在同一个有序序列里面的合并操作归并排序算法分析归并排序方法的比较基数......