选择排序 冒泡排序 MySQL 架构

1) 选择排序

思想:

1、遍历数组,选择找到最大值,记录最大值下标 maxindex,然后将最大值与最后一个值交换,

即 swap(vec[maxindex] , vec[n-1]);

2、在剩下的待排序数组中,重新找到最大值,重复第一步,swap(vec[maxindex] , vec[n-2]);

循环操作,直至数组排序完成。

cpp 复制代码
#include<iostream>

using namespace std;

const int N = 1e4;

int num[N],n;

void Select_sort(){

    for(int i = 1; i < n; i++){//外层for控制找最大值的次数
    
        int index = 0;

        for(int j = 1; j <= n-i; j++){//找待排序元素中的最大值

            if(num[index] < num[j])  

                index = j;

        } 

        swap(num[index],num[n-i]);//交换

    }

}


int main(){

    cin>>n;

    for(int i = 0; i < n; i++){

        cin>>num[i];

    }

    Select_sort();

    for(int i = 0; i < n; i++)
    
        cout<<num[i]<<" ";

    return 0;

}

平均时间复杂度:O(n^2)

第一次排序时是 n 个元素,比较 n-1 次

第二次排序时是 n-1 个元素,比较 n-2 次

第 n-1 次排序时是 2 个元素,比较 1 次

第 n 次排序时是 1 个元素,比较 0 次

元素交换次数为 k ( k < n-1 次)

时间复杂度 = 比较次数 + 交换次数

故选择排序时间复杂度为 O( 1+2+3+...+n-1+k) = O(n*(n-1)/2+k) = O(n^2)

空间复杂度:O(1)

在原数组上操作,即使用了常数级空间O(1)

稳定性:

不稳定

实例:3 2 3 1 从小到大排序(选择最小的放前面)排序之后红色 3 在黑色 3 前面,所以不稳定。

2)冒泡排序

思想:

1、从左到右,相邻两数两两比较,若下标小的数大于下标大的数则交换,将最大的数放在数组的最后一位(即下标 n-1 的位置)

2、采用相同的方法,再次遍历数组,将第二大的数,放在数组倒数第二的位置(即 n-2 的位置),以此类推,直到数组有序。

3、**优化:**当数组在整个遍历过程中没有发生交换,说明待排序数组已经有序,此时可以直接结束排序过程(用 bool 类型变量做标记)。

cpp 复制代码
#include<iostream>

using namespace std;

const int N = 1e4;

int num[N],n;

void Bubble_sort(){

    for(int i = 1; i < n; i++){
    
        bool flag = false;

        for(int j = 0; j < n-i; j++){

            if(num[j] > num[j+1])  {

                swap(num[j],num[j+1]);

                flag = true;

            }     

        } 

        if(!flag) return;

    }

}


int main(){

    cin>>n;

    for(int i = 0; i < n; i++){

        cin>>num[i];

    }

    Bubble_sort();

    for(int i = 0; i < n; i++)
    
        cout<<num[i]<<" ";

    return 0;

}

**平均时间复杂度:**O(n^2)

**最好时间复杂度(有序情况):**O(n)

比较 n-1 次,交换 0 次,故最好时间复杂度为 O(n)

**最坏时间复杂度(逆序情况):**O(n^2)

第一次排序时是 n 个元素,比较 n-1 次,交换 n-1 次

第二次排序时是 n-1 个元素,比较 n-2 次,交换 n-2 次

第 n-1 次排序时是 2个元素,比较 1 次,交换 1 次

第 n 次排序时是 1 个元素,比较 0 次,交换 0 次

故冒泡排序时间复杂度为 O((1+2+3...+n-1)*2) = O(n*(n-1)) = O(n^2)

**空间复杂度:**O(1)

在原数组上操作,即使用了常数级空间 O(1)

稳定性

稳定

3) 请说下你对 MySQL 架构的了解?

先看下 MySQL 的基本架构图:

大体来说,MySQL可以分为Server层和存储引擎两部分。

**连接器:**负责和客户端建立连接,获取权限,管理连接

**查询缓存:**在一个查询语句中,会先到缓存中查看之前是否查询过这条语句(如果开启了查询缓存功能):若存在则直接返回缓存的结果,优点是命中缓存时效率很高,缺点是缓存失效非常频繁,只要有对一个表的更新,该表所有的查询缓存都会被清空,MySQL8.0 版本已删除了查询缓存功能

**分析器:**对SQL语句进行词法分析和语法分析,判断语法是否合法

**优化器:**对SQL语句进行优化,选择索引

**执行器:**调用存储引擎接口,返回结果

**存储引擎层负责:**数据的存储和提取,其架构是插件式的,支持 InnoDB MyISAM 等多个存储引擎。从 MySQL 5.5.5 版本开始默认的是 InnoDB,但是在建表时可以通过 engine = MyISAM 来指定存储引擎。不同存储引擎数据的存取方式不同,支持的功能也不同。

相关推荐
ykuaile_h86 小时前
MySQL梳理三:查询与优化
数据库·mysql
越来越无动于衷6 小时前
智慧社区(八)——社区人脸识别出入管理系统设计与实现
java·开发语言·spring boot·python·mysql
找不到、了7 小时前
Mysql使用Canal服务同步数据->ElasticSearch
数据库·mysql·elasticsearch
宋大水8 小时前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计
_代号0078 小时前
MySQL梳理四:事务日志机制和多版本并发控制(MVCC)
mysql
啊阿狸不会拉杆10 小时前
《算法导论》第 2 章 - 算法基础
数据结构·c++·算法·排序算法
啊阿狸不会拉杆10 小时前
《算法导论》第 4 章 - 分治策略
开发语言·数据结构·c++·算法·排序算法
2501_9200470310 小时前
Mysql-事务
数据库·mysql·oracle
笑衬人心。10 小时前
MySQL 如何优化慢查询
数据库·mysql
茉莉玫瑰花茶10 小时前
MySQL内外连接详解
数据库·mysql