数据结构 之 七大排序 (持续更新ing...)

         下面算法编写的均是按照由小到大顺序进行排序版本


选择排序

思想:

        每次遍历待排序元素的最大下标,与待排序元素中最后一个元素交换位置(此时需要设置一个临时变量来存放下标)

  • 时间复杂度--O(n^2)
  • 空间复杂度--O(1)
  • 稳定性--不稳定

代码实现

#include<iostream>
using namespace std;
const int N = 1e2 + 10;
int num[N];
int n;void select_sort()
{for (int i = 1; i < n; i++)//控制找最大值的次数{int index = 1;//存待排序元素的最小元素的下标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 = 1; i <= n; i++){cin >> num[i];}select_sort();for (int i = 1; i <= n; i++) cout << num[i] << " " << endl;
}


冒泡排序 

思想:

        相邻两个元素比较,前一个比后一个大则交换

(每遍历一次都会冒出最大值 每次遍历最后一个一定是最大的)

  • 时间复杂度--O(n^2)  (逆序时达到O(n^2))
  • 空间复杂度O(--1)
  • 稳定性--稳定

优化:

        当整个数组遍历过程中没有发生交换,说明待排序数组已经有序,直接结束排序过程(bool类型变量做标记)

代码实现

#include <iostream>
using namespace std;
const int N = 1e2 + 10;
int num[N];
int n;void bubble_sort()
{for (int i = 1; i < n; i++){bool flag = false;for (int j = 1; j <= n - i; j++){if (num[j] > num[j + 1]){swap(num[j], num[j + 1]);flag = true;}}if (!flag) break;}
}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> num[i];}bubble_sort();for (int i = 1; i <= n; i++){cout << num[i] << " ";}return 0;
}


计数排序(桶排序)

思想:

将数值作为桶号,遍历整个数组,将相应的桶进行计数
1、遍历原数组,找到最大值 max,然后申请max+1个空间(桶),初始化为0(下标为0-max),即vector<int>bucket(max+1,0)
2、再次遍历原数组,找到每个数值对应的桶号,并对桶计数++,即bucket[vec[i]++

3、遍历桶数组,看对应的桶内计数为几就取出几下下标值(桶号),放到原数组中。
 

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
  • 稳定性:稳定

代码实现

#include<iostream>
using namespace std;const int N = 1e4;
int num[N];
void Bucket_Sort(int n)
{//找待排序中的最大值int max = num[0];for (int i = 1; i < n; i++)max = max < num[i] ? num[i] : max;//创建桶int* bucket = new int[max + 1] {0};//将元素放入桶中for(int i=0;i<n;i++)bucket[num[i]]++;//计数//将元素取出还原int j = 0;for (int i = 1; i <= max; i++){while (bucket[i] > 0){num[j++] = i;bucket[i]--;}}
}
int main()
{int n;cin >> n;for (int i = 0; i < n; i++){cin >> num[i];}Bucket_Sort(n);for (int i = 0; i < n; i++){cout << num[i] << " ";}return 0;
}

插入排序

思想:

        有序部分设置1个元素 无序部分设置n-1个元素,无序一个一个插入有序中。外层循环控制插入元素的个数(n-1) 内层找位置插入哪

  • 时间复杂度 :O(n^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定

代码实现

#include<iostream>
using namespace std;
void Insert_sort(int a[], int n)
{for (int i = 1; i < n; i++)//控制插入元素的个数{int temp = a[i];//记录插入元素int j = i - 1;//记录有序表中最后一个元素for (; j >= 0; j--){if (a[j] > temp)a[j + 1] = a[j];elsebreak;}a[j + 1] = temp;}
}int main()
{int a[6] = { 2,1,5,3,4,0 };Insert_sort(a, 6);for (int i = 0; i < 6; i++){cout << a[i] << " ";}return 0;
}

堆排序 

思想:将待排序数组想象成一个最大堆结构,从最后一个有子节点的根节点开始调整,即最后一个父亲节点的下标(n/2-1),(若父亲节点的坐标为i,则其左孩子的下标是2i+1,右孩子下标是2i+2)

原理

        1.完全二叉树:若树的深度为h,除第h层以外,其余各层(1~h-1)的节点数达到最大个数,第h层所有的节点都连续集中在最左边,只能从最深处右边从右往左缺省。

        2.最大堆结构:是一个完全二叉树,堆中每个节点的值总是不大于其父亲节点的值(每颗子树上根节点最大,整棵树根节点最大)

        3.创建最大堆结构:把所有非终端节点检查一遍,看是否满足最大堆的要求,若不满足,则进行调整(检查当前节点是否满足:根>=左、右,若有不满足,则当前节点与更大的一个人孩子节点进行交换,若元素互换破坏了下一级的堆,则采用相同的方式继续调整,直至符合最大堆要求,我们以数组{53,27,78,9,45,65,87,32}为例.

(二叉树的终端节点:度为零的节点,就是叶子节点)

  • 时间复杂度:O(nlog2 n)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;void adjustHeap(vector<int>& vec, int start, int end)
{int father = start;//根节点int child = father * 2 + 1;//左子树while (child <= end)//循环是为了再调整最大堆的过程中破坏子树的结结构,继续向下调整 {//因为child是左子树,根节点要大于左右子树,所以要在子树中找到最大的再与根节点进行比较,//所以要防止右子树越界就是在数组下标为child+1的元素,child就是子树中最大的元素 if (child + 1 <= end && vec[child + 1] > vec[child])child++;if (vec[child] > vec[father])//如果根节点小于子树就交换 {swap(vec[child], vec[father]);//如果发生交换继续向下调整,因为可能破环子树的最大堆结构father = child;child = 2 * father + 1;}//如果没有发生交换就退出该函数elsereturn;}
}
void HeapSort(vector<int>& vec)
{//从最后一个有子节点的节点开始调整//O(n)for (int i = vec.size() / 2 - 1; i >= 0; i--)//vec.size()/2是完全二叉树最后一个有子节点的节点 {adjustHeap(vec, i, vec.size() - 1);}//O(nlog2 n)for (int i = vec.size() - 1; i >= 1; i--){swap(vec[0], vec[i]);//只有下表为为0的元素被打乱,从根节点开始向下调整adjustHeap(vec, 0, i - 1);}
}
int main()
{vector<int>vec = { 53,17,78,9,45,65,87,32 };HeapSort(vec);for (auto it : vec){cout << it << " ";}return 0;
}


        如果你对探索机器学习的无限可能性、掌握Python编程的技巧、以及玩转各种框架的技能充满了好奇心,那么恭喜你,你来对地方了!赶紧扫描下方二维码,加入我们的微信公众号吧!这里有最新的技术趋势、独家教程、精彩案例等着你,让我们一起探索未知的领域,开启编程之旅吧!🚀🌟

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

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

相关文章

TCP - 传输控制协议

TCP - 传输控制协议 是一种面向连接的可靠传输协议。 特点&#xff1a; TCP是面向连接&#xff08;虚连接&#xff09;的传输层协议。 每一条TCP连接有且只能有两个端点。 可靠、有序、无丢弃和不重复。 TCP协议提供全双工通讯。 发送缓存 存放发送方TCP准备发送的数据。T…

FDMC8200中文资料PDF数据手册引脚图参数功能介绍概述参数规格参数产品手册

产品概述&#xff1a; 此器件在一个双 Power 33 (3 mm X 3 mm MLP) 封装中包括了两个特制的 N 沟道 MOSFET。 开关节点已经内部连接&#xff0c;可实现同步降压转换器的轻松布置和布线。 控制 MOSFET (Q1) 和同步 MOSFET (Q2) 可提供最佳功率效率。 产品特性&#xff1a; Q1…

计算机一级word 文字处理理论+实操试题

计算机一级word 文字处理理论实操试题 单选题&#xff1a; 1、在Word编辑状态下&#xff0c;要将另一文档的内容全部添加在当前文档的当前光标处&#xff0c;应选择的操作是依次单击______。 A.“文件”选项卡和“打开”项 B.“文件”选项卡和“新建”项 C.“插入”选项卡…

外贸业务员的工作时间安排,抓紧收藏!

平时很多外贸业务员应该都差不多&#xff0c;大部分时间会用来不知所措的摸鱼&#xff0c;关于工作内容并无规划。今天给大家分享一个工作时间安排&#xff0c;赶紧码住&#xff01; 销售联系潜在客户时间计划表 目标:在不给潜在客户造成压力的情况下&#xff0c;建立联系并推…

WEB前端作业一

作业1:生成表格 模版 <!DOCTYPE html> <html><title>作业表格一</title><body><h1><b>工商银行电子汇款单</b></h1><p><table border"1" cellspacing"0"><tr><td colspan&qu…

最小化战斗力差距——算法思路

题目链接&#xff1a;1.最小化战斗力差距 - 蓝桥云课 (lanqiao.cn) 可分析&#xff0c;把一个数组分成两组&#xff0c;求一组的最大值与另一组的最小值的差值的绝对值最小&#xff0c;可以转换为求任意两个相邻数字之间的最小插值的绝对值。 可看图示&#xff1a; package lan…

记录工作中莫名其妙的bug

1、问题&#xff1a;办公室的电脑突然除了我之外&#xff0c;都不能访问我们的线上系统了 原因&#xff1a;因为是内网&#xff0c;同事有刚刚升级了Windows11&#xff0c;配置的DNS被清了&#xff0c;还有同事换了公司的新电脑&#xff0c;还没有配DNS 位于&#xff1a;C /Win…

如何在CentOS系统部署AMH主机面板并实现无公网IP远程连接

文章目录 推荐1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击…

数据库SQLServer——插入数据

1.插入数据语法 INSERT INTO table_name(column_list) VALUES (value_list); --简写 INSERT INTO table_name VALUES (value_list);INSERT table_name VALUES (value_list); 2.实例 2.1基本形式&#xff08;不安全&#xff09; insert into 学生表01 values(李明,男,1.70) …

python实现--二叉搜索树

什么是二叉搜索树 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种特殊类型的二叉树&#xff0c;它具有以下性质&#xff1a; 每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。 对于任意节点&#xff0c;其左子树中的所有节点的…

python 调用redis创建查询key

部署redis apiVersion: apps/v1 # 描述api版本&#xff0c;默认都用这个 kind: Deployment # 资源类型&#xff0c;可以配置为pod&#xff0c;deployment&#xff0c;service&#xff0c;statefulset等等 metadata: # deployment相关的元数据&#xff0c;用于描述deployment的…

LeetCode199题:二叉树的右视图(python3)

代码思路&#xff1a;深度优先搜索&#xff0c;每次总访问右子树&#xff0c;value_depth用dict存放&#xff0c;深度为索引&#xff0c;存放节点的值&#xff0c;stack从根节点[(root, 0)]开始&#xff0c;添加node和depth class Solution:def rightSideView(self, root: Opt…

测试工具分享:高效完成测试工作!

说在前头 在社会上&#xff0c;特别是技术圈&#xff0c;大家会有刻板印象&#xff1a;测试工作的含金量不高。因为大家觉得测试不重要&#xff0c;导致给测试的薪水也偏低&#xff1b;这又反向导致好的人才不想来测试行业&#xff0c;测试从业人员的平均水平、工作体现的价值…

贪心算法(算法竞赛、蓝桥杯)--线段覆盖

1、B站视频链接&#xff1a;A29 贪心算法 P1803 线段覆盖_哔哩哔哩_bilibili 题目链接&#xff1a;凌乱的yyy / 线段覆盖 - 洛谷 #include <bits/stdc.h> using namespace std;struct line{int l,r;bool operator<(line &b){return r<b.r;//重载小于号,按右端…

Windows系统安装GeoServe结合内网穿透实现公网访问本地位置信息服务

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

ai写作一键生成,分享6种好用的写作软件,一定要看

在写文章时&#xff0c;我们常常会遇到灵感丧失、词句不顺的情况&#xff0c;为了解决这一问题&#xff0c;小编为大家推荐几款实用的AI写作软件&#xff0c;一同来探索一下吧&#xff01; 一、爱制作AI 爱制作AI是一款专注于写作的软件&#xff0c;强大的智能数据库让它备受…

Docker进阶:离线安装docker社区版(docker-18.06.3-ce)

Docker进阶&#xff1a;离线安装docker社区版&#xff08;docker-18.06.3-ce&#xff09; 1、准备离线安装所需的文件2、传输文件至目标Linux系统3、卸载旧版Docker4、离线安装Docker1、解压上传的Docker安装包2、拷贝文件到/usr/bin目录3、将 Docker 注册为系统服务4、重新加载…

力扣203. 移除链表元素

写法1、头节点 和 后面的节点 删除规则不一致 class Solution {public ListNode removeElements(ListNode head, int val) {//如果不建虚拟头节点&#xff0c;那删头节点和删后面的节点&#xff0c;逻辑是不一样的//头节点可能连续多个命中val,所以有while&#xff0c;不是ifwh…

2684. 矩阵中移动的最大次数

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整数组成。 …

How to upgrade NBU cluster from 10.0.0.1 to 10.2.0.1

1. Environment Statement OS: SuSE 12 SP4 InfoScale: 7.4.2 NBU: 10.0.0.1 2. Download EEB patch and utf8 tools 2.1 Donwload utf8 check tools from Veritas. utf8 character check before NBU upgrade, upgrade will be failed if “NBDB” is using utf8 characte…