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

归并排序

时间:2024-06-23 18:31:21浏览次数:3  
标签:归并 end int mid start 有序 排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n)),算法不是自适应的,不需要对数据的随机读取。

// 排序入口
    public static void mergeSort(int[] A) {
        sort(A, 0, A.length - 1);
    }

    //递归
    public static void sort(int[] A, int start, int end) {
        if (start >= end)
            return;
        // 找出中间索引
        int mid = start + (end - start) / 2;
        // 对左边数组进行递归
        sort(A, start, mid);
        // 对右边数组进行递归
        sort(A, mid + 1, end);
        // 合并
        merge(A, start, mid, end);
    }

    // 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
    public static void merge(int[] A, int start, int mid, int end) {
        int[] temp = new int[A.length];// 临时数组
        int k = 0;
        int i = start;
        int j = mid + 1;
        while (i <= mid && j <= end) {
            // 从两个数组中取出较小的放入临时数组
            if (A[i] <= A[j]) {
                temp[k++] = A[i++];
            } else {
                temp[k++] = A[j++];
            }
        }
        // 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
        while (i <= mid) {
            temp[k++] = A[i++];
        }
        while (j <= end) {
            temp[k++] = A[j++];
        }
        // 将临时数组中的内容拷贝回原数组中 (left-right范围的内容)
        for (int m = 0; m < k; m++) {
            A[m + start] = temp[m];
        }
    }

 

标签:归并,end,int,mid,start,有序,排序
From: https://www.cnblogs.com/zhengbiyu/p/18263772

相关文章

  • 了解如何使用DIR命令来查看和管理文件系统中的文件和目录;更加灵活地利用 DIR 命令来筛
    应用大纲:初级使用方法1.基本用法使用 DIR 命令来列出当前目录中的所有文件和子目录。2.切换到不同目录使用 DIR[驱动器:][路径] 来列出指定目录中的文件和子目录。例如,DIRC:\Users。3.常用选项/P:分页显示结果,每页一屏。/W:宽列表格式显示,减少详细信息。/A:按......
  • C#实现禁用DataGridView控件列表头自动排序功能 (附完整源码)
    C#实现禁用DataGridView控件列表头自动排序功能代码说明:在C#中,可以通过设置DataGridView控件的列的SortMode属性来禁用列头的自动排序功能。以下是一个完整的示例代码,展示了如何实现这一功能:usingSystem;usingSystem.Windows.Forms;​namespace......
  • 十大经典排序算法——插入排序与希尔排序(超详解)
    一、插入排序1.基本思想直接插入排序是一种简单的插入排序法,基本思想是:把待排序的记录按其数值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。2.直接插入排序当插入第end+1 个元素时,前面的arr[0],arr[1],... ,arr[end]已经......
  • 【CPP】插入排序、希尔排序
    目录1.插入排序1.1直接插入排序简介代码分析1.2直接插入对比冒泡排序简介代码对比分析(直接插入排序与冒泡的复杂度效率区别)1.3希尔排序简介代码分析1.插入排序基本思想:把一个待排数字按照关键码值插入到一个有序序列中,得到一个新的有序序列。1.1直接插入排序......
  • python 快速排序
     快速排序快速排序是一种非常高效的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 以下是一个使用Python实现的快速排序的示例代码: pythond......
  • 如何用GO语言实现快速排序算法?
    本章教程,介绍一下如何用GO语言实现基础排序算法中的快速排序。快速排序(Quicksort)是一种高效的排序算法,它采用分治法策略,将一个数组分成两个子数组,然后递归地对这两个子数组进行排序。一、程序代码packagemainimport( "fmt" "math/rand" "time")//quickSo......
  • MySQL-文件排序原理详解
    目录Usingfilesort文件排序原理详解filesort文件排序方式示例验证下各种排序方式:单路排序的详细过程:双路排序的详细过程:单路排序相对于双路排序具有以下特点:Usingfilesort文件排序原理详解filesort文件排序方式单路排序:是一次性取出满足条件行的所有字段,然后在s......
  • 使用MPI 实现奇偶排序
    使用MPI实现奇偶排序0号进程获得待排序序列并输出排序好的序列使用文件进行输入输出进行性能测试与对比代码奇偶排序头文件引入#include<iostream>#include<algorithm>#include<mpi.h>#include<fstream>#include<chrono>定义规模#defineN100000000......
  • Python 冒泡排序
    冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。以下是一个用Python实现的冒泡排序算法的例子:pythondefbubble_sort(lst):n=len......
  • 随机链表的复制 && 排序链表
    随机链表的复制题目.-力扣(LeetCode)思路:思路:       ①一个结点一个节点去拷贝,当拷贝了第一个节点的时候,把原节点与拷贝节点连接起来,直接到所有的节点拷贝完毕,这样做的目的是为下一步处理random指针做准备      ②处理random       ③处理......