【C++】数据结构与算法:常用排序算法

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍常用排序算法。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 算法介绍
    • :blush:2. C++实现

😏1. 算法介绍

排序算法是计算机科学中常见的一类算法,用于将一组数据按照特定的顺序进行排列。下面介绍几种常见的排序算法:

  1. 冒泡排序(Bubble Sort):
  • 从待排序序列的第一个元素开始,两两比较相邻元素的大小,如果顺序不对则交换位置。
  • 每一轮结束后,最大(或最小)的元素会移动到末尾。
  • 时间复杂度:平均情况和最坏情况下为 O(n^2),最好情况下为 O(n)。
  • 空间复杂度:O(1)。
  1. 插入排序(Insertion Sort):
  • 将未排序序列的第一个元素插入已排序序列的正确位置。
  • 从第二个元素开始,依次与前面的元素比较并插入到正确位置。
  • 时间复杂度:平均情况和最坏情况下为 O(n^2),最好情况下为 O(n)。
  • 空间复杂度:O(1)。
  1. 选择排序(Selection Sort):
  • 每一轮从待排序序列中选择最小(或最大)的元素,与当前位置交换。
  • 每一轮结束后,当前位置之前的元素都是有序的。
  • 时间复杂度:平均情况和最坏情况下为 O(n^2)。
  • 空间复杂度:O(1)。
  1. 快速排序(Quick Sort):
  • 选择一个基准元素,将序列分为比基准小的元素和比基准大的元素。
  • 递归地对划分后的子序列进行快速排序。
  • 时间复杂度:平均情况下为 O(nlogn),最坏情况下为 O(n^2)。
  • 空间复杂度:平均情况下为 O(logn),最坏情况下为 O(n)。
  1. 归并排序(Merge Sort):
  • 将序列递归地拆分成两个子序列,对子序列进行排序,然后合并两个有序子序列。
  • 使用分治法思想,将排序问题分解为较小的子问题。
  • 时间复杂度:平均情况下为 O(nlogn)。
  • 空间复杂度:O(n)。

😊2. C++实现

#include <iostream>
#include <cstdlib>
#include <ctime>// 冒泡排序 bubbleSort 两两比较
void bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {std::swap(arr[j], arr[j+1]);}}}
}// 选择排序 selectionSort 选最小值
void selectionSort(int arr[], int n) {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;}}std::swap(arr[i], arr[minIndex]);}
}// 插入排序 insertionSort 依次成序
void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}// 归并排序 mergeSort
void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int* L = new int[n1];int* R = new int[n2];for (int i = 0; i < n1; i++) {L[i] = arr[left + i];}for (int j = 0; j < n2; j++) {R[j] = arr[mid + 1 + j];}int i = 0;int j = 0;int k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}delete[] L;delete[] R;
}void mergeSort(int arr[], int left, int right) {if (left < right) {int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
}// 快速排序 quickSort
int partition(int arr[], int low, int high) {int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] <= pivot) {i++;std::swap(arr[i], arr[j]);}}std::swap(arr[i+1], arr[high]);return i+1;
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}// 打印数组
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;
}int main() {const int SIZE = 10;// 生成随机整数数组int arr[SIZE];srand(time(0));for (int i = 0; i < SIZE; i++) {arr[i] = rand() % 100; // 生成 0 到 99 的随机数}std::cout << "Original array: ";printArray(arr, SIZE);// 使用冒泡排序进行排序bubbleSort(arr, SIZE);std::cout << "Array after bubble sort: ";printArray(arr, SIZE);// 使用选择排序进行排序selectionSort(arr, SIZE);std::cout << "Array after selection sort: ";printArray(arr, SIZE);// 使用插入排序进行排序insertionSort(arr, SIZE);std::cout << "Array after insertion sort: ";printArray(arr, SIZE);// 使用归并排序进行排序mergeSort(arr, 0, SIZE-1);std::cout << "Array after merge sort: ";printArray(arr, SIZE);// 使用快速排序进行排序quickSort(arr, 0, SIZE-1);std::cout << "Array after quick sort: ";printArray(arr, SIZE);return 0;
}

编译运行:

g++ -o main main.cpp && ./main

在这里插入图片描述

以上。

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

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

相关文章

【前端版】分布式医疗云平台【Open-his 环境搭建、前台 vue-element-ui 搭建】(十六)

目录 1、Open-his 环境搭建 1.1.【前端】vue-element-ui-admin 1.2.【前端】安装 node 服务器 1.3.【前端】安装 VSCode

python字符串常用操作

目录 1. find() 字符串查找2. 字符串匹配 6 种方法 1. find() 字符串查找 python字符串find的应用 查找到字符串的位置&#xff0c;给出所在字符串的下标位置。如下给出的只是下标第6个&#xff1a; a "伤感上单乱杀" # 01 23 4 567 print(a.find("乱杀&…

什么是SYN攻击

SYN攻击属于DOS攻击的一种&#xff0c;它利用TCP协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费CPU和内存资源。TCP协议建立连接的时候需要双方相互确认信息&#xff0c;来防止连接被伪造和精确控制整个数据传输过程数据完整有效。所以TCP协议采用三次握手建立…

Red Hat 安装MySQL 8.0与 Navicat

目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…

【单片机】晨启科技,酷黑版,密码锁

密码锁 任务要求&#xff1a; 当输入密码&#xff08;至少6位密码&#xff09;时&#xff0c;OLED显示屏显示输入的数字&#xff08;或者字符&#xff09;&#xff0c;当密码位数输入完毕按下确认键时&#xff0c;对输入的密码与设定的密码进行比较&#xff08;可使用外设键盘&…

数字化转型的本质、路径、阶段和挑战一篇讲明白

01企业数字化转型的本质 数字化可以将人类所处的真实世界和虚拟数字连接起来&#xff0c;从中寻求全新的商业模式。数字化转型基于数字化新技术出现和发展&#xff0c;能够帮助企业将原有传统业务与数字化技术进行结合&#xff0c;以解决企业发展过程中的实际问题&#xff0c;同…

Spark知识点总结

1. Spark支持哪几种运行模式&#xff1f; 本地模式&#xff08;Local Mode&#xff09;&#xff1a;在这种模式下&#xff0c;Spark在单个机器上运行。所有的Spark操作都在一个单独的JVM进程中进行。这种模式适合开发和测试&#xff0c;但不适合处理大规模的数据。 集群模式&a…

C语言--strcat(拼接)

字符串拼接strcat使用及实现 拼接—strcat 原型&#xff1a;charstrcat(chardest,const charsrc) 把src所指向的字符串&#xff08;包括’\0’&#xff09;复制到dest所指向的字符串后面&#xff08;删除dest原来末尾的’\0’&#xff09;&#xff0c;要保证dest足够长&#xf…

STM32的电动自行车信息采集上报系统(学习)

摘要 针对电动自行车实时监管不便的问题&#xff0c;设计了一种基于STM32的电动自行车信息采集系统&#xff0c;通过获取电池、位置和行驶状态信息并上报到服务器中&#xff0c;实现实时监管。 通过多路串口请求电池、行驶状态和位置信息&#xff0c;以并发方式进行数据接收、…

Podman Desktop安装与使用-Windows10

下载 containers/podman 地址 Podman Desktop Downloads 地址 我这里演示的是podman-v4.4.4.msi和podman-desktop-0.13.0-setup.exe 安装 先决条件&#xff1a;由于 Podman 使用 WSL&#xff0c;因此您需要最新版本的 Windows 10 或 Windows 11。在 x64 上&#xff0c;WSL…

centos 7 系统上重启 mysql 时报错 Failed to restart mysqld.service: Unit not found.

在 centos 7 系统上&#xff0c;使用常规命令&#xff1a;systemctl restart mysql 或 service mysqld restart 重启 mysql 时都会报如下错误&#xff1a; Failed to start mysqld.service: Unit not found. 根据所报错误&#xff0c;在网上搜罗了一圈&#xff0c;未果&#x…

【Unity3D应用案例系列】Unity3D中实现文字转语音的工具开发

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;会遇到将文字转语音输出的需求&#xff0…

Stable Diffusion系列课程二:ControlNet

AUTOMATIC1111/stable-diffusion-webui参考B站Nenly视频《零基础学会Stable Diffusion》、视频课件推荐网站&#xff1a;stable-diffusion-art、Civitai&#xff08;魔法&#xff09; 、libilibi、AI艺术天堂推荐Stable Diffusion整合资料&#xff1a; NovelAI资源整合、《AI绘…

Vivado使用入门之一:Schematic图

目录 一、前言 二、Schematic类型 2.1 Schematic分类 2.2 RTL ANALYSIS 2.3 SYSTHESIS 2.4 IMPLEMENTATION 三、Schematic功能 3.1 界面工具栏 3.2 右键功能项对比 3.3 右键功能项说明 3.4 逻辑图界面 一、前言 在一个设计中&#xff0c;有时因定位或其他原因需要去查…

MySQL字段类型与存储空间的关系

在 MySQL 中&#xff0c;对于整数类型&#xff08;如 INT&#xff09;、字符类型&#xff08;如 VARCHAR&#xff09;、浮点数类型&#xff08;如 DOUBLE&#xff09;等&#xff0c;参数&#xff08;括号中的数字或长度&#xff09;通常用于限制数据的范围或精度&#xff0c;但…

【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

IMX6ULL一共有两个ADC&#xff0c;每个ADC都有八个通道&#xff0c;但他们共用一个ADC控制器 1.设备树 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 adc1: adc02198000 {compatible "fsl,imx6ul-adc", "fsl,vf610-adc";reg <0x0219…

【Java】智慧工地管理系统源码(SaaS模式)

智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术&#xff0c;与施工生产过程相融合。 一、什么是智慧工地 智慧工地是指利用移动互联、物联网、智能算法、地理信…

elementUi重置Select选择器样式、option、deep、vue3、plus

文章目录 前言select选框样式(element-plus)option选项面板样式(element-plus) 前言 样式标签属性为<style scoped lang"scss"></style> select选框样式(element-plus) // 设置选择框的背景样式 ::v-deep .el-input__wrapper {background: transparent;b…

向日葵远程情况下VS2019黑屏问题解决办法

文章目录 一. 电脑在身边情况下二. 只能远程情况下 一. 电脑在身边情况下 直接操作远程的电脑&#xff0c;打开vs&#xff0c;选择工具&#xff0c;点击选项 选择常规&#xff0c;取消勾选 二. 只能远程情况下 远程通过VS打开一个项目&#xff0c;可以看到一片空白 选中VS…

mysql的collations

在 MySQL 数据库中&#xff0c;Collation&#xff08;排序规则或字符集排序规则&#xff09;是用于指定字符集的字符比较和排序方式的一组规则。它决定了在比较和排序字符时&#xff0c;字符的顺序、大小写敏感性、重音符号等特性。 每个 MySQL 数据库都有一个默认的字符集和排…