一、八大排序(sort)

2023-09-21 08:41:37

一、时间复杂度

(一)定义:常数操作

与数据量无关,是一个固定的东西。
一个操作如果和样本数量没有关系,每次都是固定时间内完成的操作,就叫做常数操作。

时间复杂度为一个算法流程中,常数操作数量的一个指标。常用o(读作big o)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。

二、空间复杂度

(一)定义:

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势。

三、排序

(一)选择排序

1.定义

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
请添加图片描述

2.代码

void process(vector<int> &arr) {
    if (arr == nullptr || arr.size() < 2) {
        return ;
    }
    for (int i = 0 ; i < arr.size() - 1; i++) { // 当前位置
        int minIndex = i;
        for (int j = i + 1; j < arr.size(); j++) {
            minIndex = arr[j] < arr[minIndex] ? j : minIndex;
        }
        swap(arr,i,minIndex);
    }
}
void swap(vector<int> &arr,int j,int j) {
    arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];
}

3.特性

  • 容易理解,但是效率太低,实际当中不太使用

  • 时间复杂度O(n^2),空间复杂度O(1);请添加图片描述

  • 不稳定

(二)冒泡排序

1.定义

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

2.代码

void bubbleSort(vector<int> &arr) {
    if (arr == nullptr || arr.size() < 2) {
        return ;
    }
    int n = arr.size();
    for (int i = 0; i < n; i++) { // //控制交换次数
        for (int j = 0; j < n - i - 1; j ++) { // //向后冒泡 ,控制边界
            if(arr[j] > arr[j+1])//如果前一个值大于后一个值,交换
			{
				swap(arr[j],arr[j+1]);
			}		
        }
    }
}

3.特性

  • 容易理解
  • 时间复杂度O(n^2),空间复杂度O(1)
  • 稳定

(三)插入排序

1.定义

插入排序的步骤如下:每次从无序部分中取出一个元素,与有序部分中的元素从后向前依次进行比较,并找到合适的位置,将该元素插到有序组当中。

例:对于数组 [3,2,5,4,2,3,3] 进行插入排序的详细过程:
1、0~0位置上做到有序 ——>就一个数 做到了
2、0~1位置上做到有序 ——>2比3小 2 3互换位置——> [2,3,5,4,2,3,3]
3、0~2位置上做到有序 ——>5比3大 位置不动——> [2,3,5,4,2,3,3]
4、0~3位置上做到有序 ——>4比5小 4 5互换位置——> [2,3,4,5,2,3,3]——>4比3大 位置不动
5、0~4位置上做到有序 ——>2比5小 2 5互换位置——> [2,3,4,2,5,3,3]
  ——>2比4小 2 4互换位置——> [2,3,2,4,5,3,3]——>2比3小 2 3互换位置——> [2,2,3,4,5,3,3]
  2比2相等 位置不动
6、0~5位置上做到有序 ——>3比5小 3 5互换位置——> [2,2,3,4,3,5,3]
  ——>3比4小 3 4互换位置——> [2,2,3,3,4,5,3]——>3比3相等 位置不动
7、0~6位置上做到有序 ——>3比5小 3 5互换位置——> [2,2,3,3,4,3,5]
  ——>3比4小 3 4互换位置——> [2,2,3,3,3,4,5]——>3比3相等 位置不动

请添加图片描述

2.代码

void insertSort(vector<int> &arr) {
    if (arr == nullptr || arr.size() < 2) {
        return ;
    }
    
    for (int i = 1; i < arr.size(); i++) { // 0 - 0 有序的
    
        for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1] ; j--) { // 想有序
            swap(arr,j, j + 1);
        }
        
    }
}

3.特性

  • 元素集合越接近有序,直接插入排序算法的时间效率越高
  • 时间复杂度:O(n^2)(情况最差时,即逆序转有序,最好为O(n));
  • 空间复杂度:O(1);
  • 稳定

(四)归并排序

1.定义

对于一个数组从中点的位置分开,先让左侧部分排好序,再让右边部分排好序,然后整体整合。

将图中左侧部分和右侧部分分别排好序,然后使用两个指针分别从两部分的最左侧开始,在内存中单独开辟一个空间 ,这时我们比较两个指针指向的数的大小,左侧小于等于右侧的时候,将左侧部分指针指向的值拷贝到辅助空间中,然后左侧指针右移一位。如果右侧部分指针指向的值小于左侧的,则将右侧部分指针指向的值拷贝到辅助空间中,然后右侧指针右移一位。依次循环,如果哪侧越界了,将剩下的部分直接拷贝到辅助空间中。将辅助空间拷贝到原数组。
请添加图片描述

2.代码

3.特性

  • 整体就是简单的递归,左边排好序、右边排好序、让整体有序
  • 让其整体有序的过程里用了排外序的方法
  • 利用master公式来求解时间复杂度
  • 归并排序的实质

(五)快速排序

(六)堆排序

(七)基数排序

(八)计数排序

更多推荐

activemq学习笔记

传统的request/response在客户端提交请求后必须等待服务端处理完毕给于反馈,这期间客户端完全处于空闲等待状态,甚至有可能超时;·基于消息中间件的request/response客户端提交请求,不必等待服务器处理,客户端可以继续进行其它操作,而服务端形成命令的消息列队,在空闲的时候进行处理,客户端可以异步接收

修改和完成SpringSecurity的登录功能

1、配置SpringSecurity改变默认表单页面但是流程不变添加loginPage、loginProcessingUrl方法//做拦截@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{//请求授权http.formLogin().log

【python爬虫】爬虫所需要的爬虫代理ip是什么?

目录前言一、什么是爬虫代理IP二、代理IP的分类1.透明代理2.匿名代理3.高匿代理三、如何获取代理IP1.免费代理网站2.付费代理服务四、如何使用代理IP1.使用requests库2.使用scrapy库五、代理IP的注意事项1.代理IP可能存在不稳定性2.代理IP可能存在安全问题3.代理IP可能存在限制六、代理IP的

【python】使用Nuitka打包python项目-demo示例

文章目录写在前面参考准备工作QuickStart参数说明使用打包程序输出目录结构日志2023.09.20写在前面本文的demo示例的代码/数据可从笔者的GitCode获取:HelloWorld参考Nuitka官网:https://github.com/Nuitka/NuitkaNuitka使用:https://daob

openGauss天津用户组招募正式启动,欢迎报名

openGauss天津用户组招募正式启动,欢迎报名!openGauss用户组(openGaussUserGroup,简称oGUG)是一个让openGauss用户就技术特性、最佳实践、运营进展等方向交流的开放性本地社区。oGUG致力于构建一个开放、多元、包容的openGauss城市用户交流社区,鼓励当地任何企事业单位、社

MySQL入门教程

MySQL是最流行的关系型数据库管理系统1、什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所谓的关系型数据库,是建立在关系模型基础上的数

计算机毕业设计nodejs+vue医院固定资产管理系统

采用B/S结构,使得系统更加容易维护。系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理资产申领模块、资产申购模块、资产入库模块、资产出库模块、用户表模块、、科室模块、固定资产模块、配置文件模块。优化代码结构。后台采用nodejs语言开发,前台页面和后台管理页面使用vue,HTML,CSS等技术开发,使用My

视频转漫画怎么转?分享三个简单便捷的操作

在现代社会,人们对于视频和漫画的需求越来越多,而将视频转换为漫画则是一种新的趋势。本文将分享三个简单便捷的操作方式和注意事项,以帮助读者更好地进行视频转漫画的操作。操作方式一:使用手机转换工具对于经常使用手机来比编辑图片或视频的小伙伴我们可以使用书单视频助手来把视频转成漫画效果,我们打开这款工具后,然后在热门工具板块中

Vue 2 进入、离开和列表过渡

前言Vue提供了多种方式来实现过渡效果。在CSS过渡和动画中自动应用class配合CSS动画库在过渡钩子函数中使用JavaScript操作DOM配合JavaScript动画库单元素/组件的过渡将元素或组件放在<transition>中可以在下列情形中触发过渡效果:使用了v-if使用了v-show使用了动态组件组件根节点

JVM:常见的垃圾回收算法

常见的垃圾回收算法分代收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(GenerationalCollection)[1]的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则。1)经验法则1:绝大多数对象都是朝生夕灭的。2)经验法则2:熬过越多次垃圾收集过程的对象就越难以消亡

BD就业复习第二天

Hbase1.架构HBase(HadoopDatabase)是一个开源的分布式、面向列族(ColumnFamily)的NoSQL数据库,它是构建在Hadoop之上的。HBase的架构设计旨在处理大规模的数据,特别适用于需要快速读写和随机访问大量数据的应用场景,如日志处理、在线实时分析等。下面是HBase的详细架构解析:

热文推荐