【数据结构】排序算法总结

news2024/11/27 4:16:36

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:浅谈数据结构
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

总结

  • 1. 归并排序
  • 2. 排序算法复杂度及稳定性分析

在这里插入图片描述
在总结之前我们先介绍一下归并排序!

1. 归并排序

归并排序(MERGE-SORT) 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:
在这里插入图片描述

代码实现:

/**
     * 归并排序
     * 时间复杂度:O(N*logN)
     * 空间复杂度:O(logN)
     * 稳定性:稳定的排序
     * 目前为止3个稳定的排序:直接插入排序、冒泡排序、归并排序
     * @param array
     */
    public static void mergeSort(int[] array){
        mergeSortFun(array,0,array.length-1);
    }
    private static void mergeSortFun(int[] array,int start,int end){
        if(start>=end){
            return;
        }
        //拆分
        int mid=(start+end)/2;
        mergeSortFun(array,start,mid);
        mergeSortFun(array,mid+1,end);
        merge(array,start,mid,end);//合并
    }
    private static void merge(int[] array,int left,int mid,int right){
        //定义拆分后的左边部分
        int s1=left;
        int e1=mid;
        //定义拆分后的右边部分
        int s2=mid+1;
        int e2=right;
        //定义一个新数组存放合并后的数据
        int[] tmp=new int[right-left+1];
        int i=0;//tmp的下标
        //同时满足-证明两个归并段都有数据
        while(s1<=e1&& s2<=e2){
            if(array[s1]<=array[s2]){
                tmp[i++]=array[s1++];
            }else{
                tmp[i++]=array[s2++];
            }
        }
        while(s1<=e1){
            tmp[i++]=array[s1++];
        }
        while (s2 <= e2) {
            tmp[i++]=array[s2++];
        }
        //把排好序的数据 拷贝回原来的数组array当中
        for(int j=0;j<tmp.length;j++){
            array[j+left]=tmp[j];
        }
    }

归并排序可以解决海量数据的排序问题:
外部排序:排序过程需要在磁盘等外部存储进行的排序
前提: 内存只有 1G,需要排序的数据有 100G
因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序。

  1. 先把文件切分成 200 份,每个 512 M
  2. 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
  3. 进行 2 路归并,同时对 200 份有序文件做归并过程,最终结果就有序了

2. 排序算法复杂度及稳定性分析

在这里插入图片描述

排序方法最好平均最坏空间复杂度稳定性
冒泡排序O(n)O(n^2)O(n^2)O(1)稳定
插入排序O(n)O(n^2)O(n^2)O(1)稳定
选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
希尔排序O(n)O(n^1.3)O(n^2)O(1)不稳定
堆排序O(n * log(n))O(n * log(n))O(n * log(n))O(1)不稳定
快速排序O(n * log(n))O(n * log(n))O(n^2)O(log(n)) ~ O(n)不稳定
归并排序O(n * log(n))O(n * log(n))O(n * log(n))O(n)稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离

目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中…

CNCC2023

中国工程院院士&#xff0c;之江实验室主任、阿里云创始人王坚&#xff1a;计算驱动的科学发现和科技创新。 国际计算机学会主席雅尼斯约阿尼迪斯(ACM President Yannis Ioannidis)。 电气和电子工程师协会计算机协会主席妮塔帕特尔(IEEE CS President Nita Patel)。 2022 I…

Python武器库开发-高级特性篇(九)

高级特性篇(九) 切片 在Python中&#xff0c;切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素&#xff0c;而切片取出序列中一个范围对应的元素&#xff0c;这里的范围不是狭义上的连续片段。 要创建切片&…

SpringMVC系列-6 异常处理器

背景 本文作为 SpringMVC系列 的第六篇&#xff0c;介绍SpringMVC的异常处理器。内容包括异常处理器的使用方式、实现原理和内置异常处理器的装配过程。 1.使用方式 自定义异常类&#xff0c;用于异常处理器&#xff1a; public class ClientException extends RuntimeExce…

宝塔安装MySQL数据库,并内网穿透实现公网远程访问

宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…

操作系统——页表、快表 + 地址转化过程(王道视频p47、p48、p49)

1.页表的基本概念&#xff1a; &#xff08;1&#xff09;part1: &#xff08;2&#xff09;part2: (备注&#xff1a;默认——逻辑页 和 物理页 的页大小是相同的&#xff01;&#xff01;&#xff01;) 2.在没有 快表的case下&#xff0c;进行逻辑地址 、 物理地址转换的流…

如何使用Codesys编程

在实际项目中&#xff0c;使用了两套TLC6伺服系统&#xff0c;不仅是因为TLC6具有电子凸轮功能&#xff0c;而且TLC6伺服驱动器内置PLC&#xff0c;使实现系统功能的编程更简单方便&#xff0c;且由于是内部编程&#xff0c;使系统响应更迅速。 TLC6内置PLC的编程环境为符合IEC…

C语言--输出格式控制(printf函数)

格式输出函数printf printf(格式控制&#xff0c;输出表列) 基本用法 格式字符功能例子d输出一个有符号的十进制整数printf("%d %d",12,-56);c输出一个字符 char ch a; printf("%c",ch); s输出一个字符串printf("%s","oh my god&…

Go学习第十六章——Gin文件上传与下载

Go web框架——Gin文件上传与下载 1. 文件上传1.1 入门案例&#xff08;单文件&#xff09;1.2 服务端保存文件的几种方式SaveUploadedFileCreateCopy 1.3 读取上传的文件1.4 多文件上传 2. 文件下载2.1 快速入门2.2 前后端模式下的文件下载2.3 中文乱码问题 1. 文件上传 1.1 …

年度最佳榜单之 10 大免费数据恢复软件

我们经常会因为不小心从硬盘驱动器、SD 卡和数码相机等存储设备中删除重要数据而丢失它们。还有许多其他原因&#xff0c;如格式化、病毒攻击和不当操作都可能导致数据丢失。在本文中&#xff0c;我向您推荐年度最佳数据恢复软件列表&#xff0c;以帮助恢复丢失的数据。 10 大免…

强大易于编辑的流程图组织图绘制工具draw.io Mac苹果中文版

draw.io可以绘制多种类型的图表&#xff0c;包括但不限于流程图、组织结构图、网络图、UML图、电气工程图等。draw.io提供了丰富的图形元素和编辑功能&#xff0c;使用户能够轻松地创建和编辑各种复杂的图表。同时&#xff0c;该软件还支持多种导出格式&#xff0c;方便用户在不…

Openssl数据安全传输平台017:客户端在Linux上的编译与调试

客户端代码在widows上编译&#xff0c;除了protobuf找不到目录&#xff0c;其他的基本没有什么问题。 然后打开虚拟机&#xff0c;项目文件已经在/home/projects目录下了 进入项目文件&#xff0c;对代码进行编译 第一次 // 找不到protobuf g *.cpp *.cc -ljson -lpthread -…

计算机中了locked勒索病毒怎么办,locked勒索病毒解密,数据恢复

当下网络技术飞速发展&#xff0c;但同样带来的网络安全威胁也不断增加&#xff0c;其中较为明显的威胁就是locked勒索病毒&#xff0c;自从今年以来&#xff0c;很多企业的计算机都遭受到了locked勒索病毒攻击&#xff0c;导致企业的计算机系统瘫痪。通过云天数据恢复工程师对…

【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)

文章目录 2678. 老人的数目&#xff08;简单遍历模拟&#xff09;1155. 掷骰子等于目标和的方法数&#xff08;动态规划&#xff09;2698. 求一个整数的惩罚数&#xff08;预处理dfs回溯&#xff09;2520. 统计能整除数字的位数&#xff08;简单模拟&#xff09;1465. 切割后面…

✨✨✨if __name__ == “__main__“ 在 Python 中意味着什么?

✨✨✨if __name__ "__main__" 在 Python 中意味着什么&#xff1f; 1. 原理2. 总结参考 在阅读其他人的代码时&#xff0c;你可能遇到过 Python 的 if__name__ “main” 习惯用法。这篇博客将了解有关 Python if name “main” 习惯用法的所有信息。 1. 原理 这…

linux 模块安装与卸载

文章目录 模块实现编译模块的 makefile编译报错解决模块编译日志自动化模块安装模块卸载 模块实现 新建 my_module.c 文件 #include <linux/types.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h>static int __ini…

python随手小练8(南农作业题)

题目1: 输入3 门课程 a,b,c 的成绩,求 3 门成绩的总和平均值(整数,四舍五人)以及最高和最低值。如果3门课程考试成绩分别以权重 0.50.3 和0.2计人总评成绩(整数先求总和再四舍五入),则最终总评成绩是多少? 具体操作&#xff1a; a float(input("a:")) b float(in…

基于Java的体育竞赛成绩管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

qt高精度定时器的使用停止线程应用

##线程停止 //线程停止应用 public: explicit WorkerThread(QObject *parent 0) :QThread(parent), m_bStopped(false){qDebug() << "Worker Thread : " << QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop() {qDebug()…

JEnv使用初体验

Java多版本控制器初体验 1、前言 由于公司项目使用jdk8版本&#xff0c;而日常学习会使用其他版本例如jdk17等&#xff0c;往常都是修改环境配置目录实现。 2、下载资料 链接&#xff1a;https://pan.baidu.com/s/1UqzHv8K8WBu-75Ysyc_h3A 提取码&#xff1a;ra6a 3、安装 …