排序进行曲-v1.0

排序

排序是将一组数据按照一定的规则进行排列的过程。在计算机科学中,排序是一
种常见的算法问题,通常用于对数据进行整理、查找、统计等操作。

概念解读

基本概念

排序算法:排序算法是实现数据排序的具体方法。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。每个排序算法都有其特定的时间复杂度和空间复杂度,适用于不同规模和特点的数据集合。排序稳定性:排序稳定性是指排序算法在排序过程中是否能够保持相等元素的相对顺序不变。稳定的排序算法可以确保相等元素的顺序不会发生变化,而不稳定的排序算法则无法保证。例如,对于序列[3a, 2, 3b, 1],如果排序算法是稳定的,那么排序后的结果应该是[1, 2, 3a, 3b],否则可能是[1, 2, 3b, 3a]内部排序和外部排序:内部排序是指在内存中对数据进行排序,而外部排序是指在外部存储介质(如硬盘)上对数据进行排序。内部排序通常适用于数据规模较小的情况,可以直接将数据加载到内存中进行排序;而外部排序适用于数据规模较大的情况,需要借助外部存储介质进行分段排序。排序的时间复杂度和空间复杂度:排序算法的时间复杂度是指排序算法执行所需的时间,通常以大O表示法表示。不同的排序算法具有不同的时间复杂度,从O(n^2)到O(nlogn)不等。排序算法的空间复杂度是指排序算法执行所需的额外空间,包括辅助数组、栈空间等。空间复杂度也是根据算法的特点而不同。排序的稳定性和效率的权衡:在选择排序算法时,需要考虑排序的稳定性和效率之间的权衡。稳定的排序算法可以确保相等元素的相对顺序不变,但可能牺牲一定的效率;而不稳定的排序算法可能具有更高的效率,但无法保证相等元素的顺序。具体选择哪种排序算法取决于具体的应用场景和需求。

分类

内部排序和外部排序

 内部排序:所有待排序的数据可以一次性加载到内存中进行排序,常见的内部排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。外部排序:待排序的数据量太大,无法一次性加载到内存中进行排序,需要利用外部存储进行排序,常见的外部排序算法有多路归并排序、败者树排序等。
内部排序精讲
冒泡排序是一种简单的排序算法,它通过多次比较相邻的元素,并交换位置,从而将最大(或最小)的元素逐渐“冒泡”到正确的位置。插入排序是一种通过构建有序序列,对未排序数据逐个进行插入的排序算法。在插入排序中,将第一个元素视为已排序序列,然后将后续元素依次插入到已排序序列的正确位置。选择排序是一种简单直观的排序算法,它通过每次从未排序序列中选择最小(或最大)的元素,将其放置到已排序序列的末尾。快速排序是一种高效的排序算法,它采用分治的策略,将问题分解为多个子问题,并通过递归的方式解决。快速排序的基本思想是选择一个基准元素,将序列分为两个子序列,其中一个子序列的元素都小于基准元素,另一个子序列的元素都大于基准元素,然后对子序列进行递归排序。归并排序是一种稳定的排序算法,它采用分治的策略,将问题分解为多个子问题,并通过递归的方式解决。归并排序的基本思想是将序列分成两个子序列,分别进行排序,然后将两个已排序的子序列合并成一个有序序列。
外部排序精讲
多路归并排序的过程
1、将待排序的序列分成多个子序列,每个子序列都是有序的。2、创建一个辅助数组,用于存储合并后的有序序列。3、依次比较每个子序列的第一个元素,选择最小的元素放入辅助数组中,并将该元素所在子序列的指针后移一位。4、重复步骤3,直到所有子序列都为空。5、将辅助数组中的元素复制回原始序列。败者树排序过程
1、初始化败者树:首先,我们需要创建一个败者树的数据结构。败者树是一棵完全二叉树,每个节点表示一个参与排序的数据源。在初始化时,所有节点的值都设置为正无穷大,表示初始状态下的败者。2、建立初始归并段:接下来,我们从每个数据源中读取一个元素,构成初始的归并段。归并段是一个有序的数据序列,每个数据源对应一个归并段。3、比较并选择胜者:对于每个归并段,我们需要比较归并段中的元素,并选择其中的胜者。胜者是指归并段中最小的元素。在比较过程中,我们将败者树中对应节点的值与归并段中的元素进行比较,如果归并段中的元素较小,则将其作为胜者,并将其索引保存在败者树的对应节点中。4、重建败者树:在选择胜者后,我们需要根据新的胜者重新调整败者树。具体操作是将新的胜者与其父节点进行比较,如果新的胜者较小,则将其与父节点交换位置,并继续向上调整,直到达到根节点。5、输出胜者:重复步骤3和步骤4,直到所有归并段中的元素都被选择为胜者。此时,败者树的根节点中保存的就是最小的元素。我们将该胜者输出,并从对应归并段中读取下一个元素,继续比较和选择胜者。6、归并段更新:当一个归并段中的元素被输出后,我们需要从对应的数据源中读取一个新的元素来更新该归并段。如果数据源已经读取完毕,则将其对应节点的值设置为正无穷大,表示该数据源已经没有更多的元素可供选择。7、重复步骤3到步骤6,直到所有数据源中的元素都被输出。

比较排序和非比较排序

 比较排序:通过比较待排序元素之间的大小关系来进行排序,常见的比较排序算法有插入排序、选择排序、冒泡排序、快速排序、归并排序、堆排序等。非比较排序:不通过比较待排序元素之间的大小关系来进行排序,常见的非比较排序算法有计数排序、桶排序、基数排序等。

稳定排序和不稳定排序

 稳定排序:如果待排序的序列中存在相等的元素,经过排序后,相等元素之间的相对顺序不发生变化,常见的稳定排序算法有插入排序、归并排序、冒泡排序等。不稳定排序:如果待排序的序列中存在相等的元素,经过排序后,相等元素之间的相对顺序可能发生变化,常见的不稳定排序算法有选择排序、快速排序、希尔排序、堆排序等。

内排序算法的时间复杂度

 最好情况时间复杂度:表示待排序序列已经有序时的时间复杂度。最坏情况时间复杂度:表示待排序序列逆序时的时间复杂度。平均情况时间复杂度:表示待排序序列各种可能情况下的时间复杂度。

递归排序和非递归排序

递归排序:通过递归的方式进行排序,如快速排序、归并排序等。
非递归排序:不使用递归的方式进行排序,如插入排序、选择排序、堆排序等。

冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的元素,依次比较相邻的两个元素,如果它们的顺序错误就交换它们,直到没有需要交换的元素,排序完成。

步骤

1、从待排序的元素中选择第一个元素作为当前元素。
2、将当前元素与其后面的元素进行比较,如果当前元素大于后面的元素,则交换它们的位置,否则保持不变。
3、将当前元素移动到下一个位置,即将当前元素的索引加1。
4、重复步骤2和步骤3,直到当前元素移动到最后一个位置。
5、重复步骤1到步骤4,直到所有元素都被排序。

冒泡排序的核心思想

通过相邻元素的比较和交换来将最大的元素逐渐移动到最后的位置。每一轮排序都会将待排序序列中最大的元素移动到最后。

时间复杂度

时间复杂度为O(n^2),其中n是待排序序列的长度。最好情况下,待排序序列已经是有序的,只需要进行一轮比较,时间复杂度为O(n)。最坏情况下,待排序序列是逆序的,需要进行n-1轮比较,时间复杂度为O(n^2)。

代码实现

public class BubbleSort {public static void main(String[] args) {int[] arr = {5, 3, 8, 4, 2};bubbleSort(arr);System.out.println("排序结果:");for (int num : arr) {System.out.print(num + " ");}}public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换arr[j]和arr[j+1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
}

简单选择排序

简单排序,也称为冒泡排序和插入排序,是一种基本的排序算法。它的思想是通过多次比较和交换相邻的元素,将最大(或最小)的元素逐渐“冒泡”(或“插入”)到序列的一端,从而实现排序的目的。

具体步骤

以升序排序为例,简单排序的具体步骤如下1遍历待排序的序列,从第一个元素开始。
2比较当前元素与下一个元素的大小。
3如果当前元素大于下一个元素,交换这两个元素的位置,使较大的元素“冒泡”到序列的末尾。
4继续比较下一个元素,重复步骤2和步骤3,直到遍历到序列的倒数第二个元素。
5重复步骤1至步骤4,直到所有元素都按照升序排列。

时间复杂度

简单排序的时间复杂度为O(n^2),其中n为待排序序列的长度。这是因为在最坏情况下,需要进行n-1次遍历,每次遍历需要比较n-1次并进行相应的交换操作。因此,总的比较和交换次数为(n-1) + (n-2) + ... + 1 = n(n-1)/2,即O(n^2)。

代码实现

public class SelectionSort {public static void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}}public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11};selectionSort(arr);System.out.println("Sorted array:");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

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

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

相关文章

leetcode 860. 柠檬水找零

2023.8.1 简单的一个思路就是建一个大小为3的数组change &#xff0c;用于存储剩余的零钱&#xff0c;然后遍历账单&#xff0c;每次找零钱的时候判断一下是否有足够的零钱&#xff0c;不够的话直接返回false。 能坚持到结束遍历则返回true。 代码如下&#xff1a; class Solu…

【视觉SLAM入门】5.1. 特征提取和匹配--FAST,ORB(关键点描述子),2D-2D对极几何,本质矩阵,单应矩阵,三角测量,三角化矛盾

"不言而善应" 0. 基础知识1. 特征提取和匹配1.1 FAST关键点1.2 ORB的关键点--改进FAST1.3 ORB的描述子--BRIEF1.4 总结 2. 对极几何&#xff0c;对极约束2.1 本质矩阵(对极约束)2.1.1 求解本质矩阵2.1.2 恢复相机运动 R &#xff0c; t R&#xff0c;t R&#xff0c;…

安全初级知识点详解

OOP 面向对象编程&#xff08;Object Oriented Programming &#xff0c;简称OOP&#xff09;是目前主流的编程范式。它将真实世界各种复杂的关系&#xff0c;抽象为一个个对象&#xff0c;然后由对象之间的分工与合作&#xff0c;完成对真实世界的模拟。 每一个对象都是功能中…

【React】搭建React项目

最近自己在尝试搭建react项目&#xff0c;其实react项目搭建没有想象中的那么复杂&#xff0c;我们只需要使用一个命令把React架子搭建好&#xff0c;其他的依赖可以根据具体的需求去安装&#xff0c;比如AntDesignMobile的UI框架&#xff0c;执行npm install antd-mobile --sa…

无涯教程-Lua - 变量声明

变量的名称可以由字母&#xff0c;数字和下划线字符组成。它必须以字母或下划线开头&#xff0c;由于Lua区分大小写&#xff0c;因此大写和小写字母是不同的。 在Lua中&#xff0c;尽管无涯教程没有变量数据类型&#xff0c;但是根据变量的范围有三种类型。 全局变量(Global) …

[Linux]详解环境基础开发工具的使用

[Linux]环境基础开发工具的使用 文章目录 [Linux]环境基础开发工具的使用0. 前言1. Linux 软件包管理器 yumyum介绍yum的使用yum源 2. Linux编辑器-vimvim介绍vim基本模式底行模式下的命令汇总命令模式下的命令汇总vim简单配置 3. Linux编译器gcc/g4. Linux项目自动化构建工具-…

IO进程线程第四天(8.1)opendir,closedir,readdir

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

Linux|ubuntu下运行python

参考&#xff1a;ubuntu系统下切换python版本的方法 文章目录 python版本问题查看ubuntu下的所有python版本通过apt-get install可以安装不同版本python查看python版本号更新update-alternatives替代列表查看update-alternatives下的python版本切换python版本删除python版本 p…

工作记录------单元测试(持续更新)

工作记录------单元测试 之前的工作中从来没有写过单元测试&#xff0c;新入职公司要求写单元测试&#xff0c; 个人觉得&#xff0c;作为程序员单元测试还是必须会写的 于此记录一下首次编写单元测试的过程。 首先引入单元测试相关的依赖 <dependency><groupId>…

分布式开源监控Zabbix实战

Zabbix作为一个分布式开源监控软件&#xff0c;在传统的监控领域有着先天的优势&#xff0c;具备灵活的数据采集、自定义的告警策略、丰富的图表展示以及高可用性和扩展性。本文简要介绍Zabbix的特性、整体架构和工作流程&#xff0c;以及安装部署的过程&#xff0c;并结合实战…

【爬虫逆向案例】某易云音乐(评论)js逆向—— params、encSecKey解密

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 【爬虫逆向案例】某易云音乐&#xff08;评论&#xff09;js逆向—— params、encSecKey解密 1、前言2、行动…

Linux怎么从网络上下载文件

wget命令用于从网络上下载文件 下载文件&#xff1a; wget [URL]使用wget命令加上要下载的文件的URL&#xff0c;可以将文件下载到当前目录。 指定保存的文件名&#xff1a; wget -O [保存的文件名] [URL]使用-O选项后跟保存的文件名&#xff0c;可以指定下载的文件保存的名称…

EXCEL, 用if({1,0,0} ...) 实现把给定的区域,输出为任意你想要的矩阵,数组区域!

目录 1 原材料&#xff1a;这样的一个区域 工具 if({1,0,0}) 数组公式 1.1 原始数据 1.2 原理 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.1 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.2 原理1&#xff1a; if 数组原理&#…

汽车后视镜反射率检测系统

随着社会的快速发展和物质生活的提供&#xff0c;机动车越来越普及&#xff0c;道路行车安全日益重要。为了保障机动车辆和行人的安全&#xff0c;在行车时不断观察后方和两侧的图像尤为重要。机动车后视镜通过反射镜面可以提供在规定视野内后方和两侧的图像&#xff0c;从而提…

【云原生】Kubernetes中deployment是什么?

目录 Deployments 更新 Deployment 回滚 Deployment 缩放 Deployment Deployment 状态 清理策略 金丝雀部署 编写 Deployment 规约 Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态&#xff0c;而 De…

正则表达式系列|(以xx开头xx结尾提取、切分、替换)

正则表达式系列|&#xff08;以xx开头xx结尾提取、切分、替换&#xff09; 文章目录 正则表达式系列|&#xff08;以xx开头xx结尾提取、切分、替换&#xff09;[TOC] 前言一、以xx开头xx结尾进行数据处理&#xff1f;1.以xx开头xx结尾对文本拆分2.以xx开头xx结尾提取内容3.以xx…

2023 08.02 小记与展望

碎碎念系列更新 算是坚持的第一个月&#xff08;每个月更新一次&#xff0c;上次是6.29&#xff09; 主要对上月工作进行总结&#xff0c;并对后续学习内容进行规划。 一、关于工作 7月工作主要涉及以下方面&#xff1a; 1、公司自研APP维护&#xff08;主要是接口更新和修改…

Red Hat 安装JDK与IntelliJ IDEA

目录 前言 Red Hat 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Red Hat 安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 YUM是基于Red Hat的Linux发行版的一个…

大数据课程F1——HIve的概述

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解HIve的概念&#xff1b; ⚪ 了解HIve与数据库的区别&#xff1b; ⚪ 了解HIve的特点&#xff1b; 一、概述 1. Hive原本是由Facebook公司开发后来贡献给了Apache的…

R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能处理空间异质性&#xff0c;因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;…