C++ 排序(1)

以下是一些插入排序的代码

1.插入排序

1.直接插入排序

// 升序
// 最坏:O(N^2)  逆序
// 最好:O(N)    顺序有序
void InsertSort(vector<int>& a, int n)
{for (int i = 1; i < n; i++){int end = i - 1;int tmp = a[i];// 将tmp插入到[0,end]区间中,保持有序while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}
//一个一个插入  一个  一个排序

2.折半插入排序 

折半插入排序本质上就是 插入排序 +二分查找

// 折半插入排序函数
void binaryInsertionSort(std::vector<int>& arr) {int n = arr.size();for (int i = 1; i < n; ++i) {int key = arr[i];int left = 0, right = i - 1;// 二分查找插入位置while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] > key) {right = mid - 1;}else {left = mid + 1;}}// 将元素后移for (int j = i - 1; j >= left; --j) {arr[j + 1] = arr[j];}// 插入元素arr[left] = key;}
}

3.希尔排序

//希尔排序
void ShellSort(vector<int>&a, int n)
{/*int gap = 3;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[i + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}*/// gap > 1 预排序// gap == 1 直接插入排序int gap = n;while (gap > 1){//gap /= 2;gap = gap / 3 + 1;//除2是不用+1的 因为你能保证最后gap一定是1   gap为1就是直接插入排序  但是/3就不能保证了!for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[i + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}//PrintArray(a, n);}
}

希尔排序的这两种实现方式的时间复杂度是一模一样的  只是遍历的方式不一样

2.选择排序

1.直接选择排序 

void Swap(int& a, int& b) {int temp = a;a = b;b = temp;
}// 直接选择排序函数
void SelectSort(int* a, int n) {for (int i = 0; i < n - 1; ++i) {int minIndex = i;for (int j = i + 1; j < n; ++j) {if (a[j] < a[minIndex]) {minIndex = j;}}if (minIndex != i) {Swap(a[i], a[minIndex]);}}
}

可以对其进行优化   比如我一次选两个数出来

但是这个时候swap的时候要确认一下特殊情况

同时如果是有序的就可以直接break了 不用那么麻烦


void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool exchange = false;for (int i = 1; i < n-j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = true;}}if (exchange == false){break;}}
}

2.堆排序

// 左右子树都是大堆/小堆
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){// 选出左右孩子中大的那一个if (child + 1 < n && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}//堆排序
void HeapSort(int* a, int n)
{// 建堆 -- 向下调整建堆 -- O(N)for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDown(a, n, i);}// 自己先实现 -- O(N*logN)int end = n - 1;while (end > 0){Swap(&a[end], &a[0]);AdjustDown(a, end, 0);--end;}
}

 3.交换排序

1.冒泡排序


//冒泡排序// 最坏:O(N^2)
// 最好:O(N)
void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool exchange = false;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = true;}}if (exchange == false){break;}}
}

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

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

相关文章

计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作

计算机视觉图像处理基础系列&#xff1a;滤波、边缘检测与形态学操作 一、前言二、滤波&#xff1a;图像的精细化处理​2.1 滤波基础概念​2.1.1 滤波的本质​2.1.2 图像噪声来源与类型​ 2.2 线性滤波​2.2.1 均值滤波​2.2.2 高斯滤波​ 2.3 非线性滤波​2.3.1 中值滤波​ 三…

第八课:在SD中安装拓展插件

3种拓展安装方式教学 点击Extensions安装方式 经由内置列表查询安装&#xff0c;打开Available&#xff0c;输入链接&#xff0c;点击Load from:&#xff0c;然后筛选后点击Install通过链接安装&#xff0c;复制代码仓库地址&#xff0c;github/gitee&#xff0c;输入Install …

tomcat的web三大组件Sciidea搭建web/maven的tomcat项目

文章目录 1. web项目的搭建1. 创建web项目2.修改web.xml版本3.添加servlet、jsp依赖4.servlet示例&#xff08;使用注解&#xff09;5.配置tomcat6.添加artifact7.部署8.启动tomcat、访问9.打war包10.部署到tomcat 2.maven的项目搭建1.创建项目图解 2.tomcat启动方式图解idea打…

ZKmall开源商城多云高可用架构方案:AWS/Azure/阿里云全栈实践

随着企业数字化转型的加速&#xff0c;云计算服务已成为IT战略中的核心部分。ZKmall开源商城作为一款高性能的开源商城系统&#xff0c;其在多云环境下的高可用架构方案备受关注。下面将结合AWS、Azure和阿里云三大主流云平台&#xff0c;探讨ZKmall的多云高可用架构全栈实践。…

【代码模板】如何用FILE操作符打开文件?fopen、fclose

#include "stdio.h" #include "unistd.h"int main(int argc, char *argv[]) {FILE *fp fopen("1.log", "wb");if (!fp) {perror("Failed open 1.log");return -1;}fclose(fp); }关于权限部分参考兄弟篇【代码模板】C语言中…

Airflow+Spark/Flink vs. Kettle

在迁移亿级&#xff08;单表超过1.3亿&#xff09;结构化数据&#xff08;达梦→星环&#xff09;的场景下&#xff0c;Airflow&#xff08;结合分布式计算框架&#xff09;的综合效果优于Kettle&#xff0c;以下是详细对比与方案建议&#xff1a; 一、核心对比&#xff1a;Air…

多电机显示并排序

多电机显示并排序 要实现根据后端传递过来的驱动电机数据的数量来显示不同数量的数据列表&#xff0c;我们可以使用 Vue 的 v-for 指令来遍历 driveMotorData 数组&#xff0c;并为每个驱动电机生成一个数据列表。这样&#xff0c;无论后端传来多少个驱动电机的数据&#xff0…

图漾相机——C#语言属性设置

文章目录 前言1.示例程序说明2.SDK API功能介绍2.1 ListDevice 枚举设备2.2 Open 打开相机2.3 OpenDeviceByIP 通过IP打开设备2.4 Close 关闭设备2.5 DeviceStreamEnable 取流使能2.6 DeviceStreamFormatDump 取流分辨率2.7 DeviceStreamFormatConfig 取流分辨率配置2.8 Device…

thinkphp8.0上传图片到阿里云对象存储(oss)

1、开通oss,并获取accessKeyId、accessKeySecret <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><tit…

跳跃连接(Skip Connection)与残差连接(Residual Connection)

1. 跳跃连接&#xff08;Skip Connection&#xff09;的基本概念 跳跃连接是一种在深度神经网络中广泛应用的技术&#xff0c;它允许信息在网络中跨层直接传递。在传统的神经网络里&#xff0c;每一层的输出仅仅是前一层输出经过特定变换后的结果。而在具备跳跃连接的网络中&a…

【硬件视界9】网络硬件入门:从网卡到路由器

🌟引言: 专栏:《硬件视界》 【硬件视界8】电源供应器(PSU):计算机的“心脏“ 在数字化高速发展的今天,网络已成为我们日常生活和工作中不可或缺的基础设施。而支撑这一基础设施的核心要素,便是各种各样的网络硬件设备。从连接计算机到网络的网络适配器,到负责数据转发与…

最小生成树理论

1. 基本定义 生成树&#xff1a;在一个连通无向图中&#xff0c;一个生成树是包含所有顶点且边数为 n−1&#xff08;n为顶点数&#xff09;的无环连通子图。 最小生成树&#xff1a;在所有生成树中&#xff0c;边权和最小的那一棵树。也就是说&#xff0c;若每条边有一个非负…

STM32 HAL库 CANFD配置工具

用法说明&#xff1a; 该工具适用于STM32HAL库&#xff0c;可一键生成CANFD的HAL库配置代码。计算依据为HAL库&#xff0c;并参考ZLG标准。 软件界面&#xff1a; 仓库地址&#xff1a; HAL CANFD Init Gen: 适用于STM32控制器的HAL库 版本说明&#xff1a; V1.2.0 &#x…

【11408学习记录】考研英语长难句解析 | 语法拆分+写作模板+真题精讲(附高分秘籍)

2025.04.05 英语语法总结——长难句并列句并列连词并列句的省略 写作书信写作第二段注意 第三段落款 每日一句词汇第一步&#xff1a;辨别第二步&#xff1a;断开第三步&#xff1a;简化 英语 语法总结——长难句 长难句有两个特点&#xff1a;长、难。 之所以又长又难就是因…

实用的alias别名命令——比2=1+1简单的基础命令

目录 alias命令的用处alias命令的写法让alias别名永久存在的办法下篇预告 alias命令的用处 别名&#xff0c;就是linux系统中的命令的别称&#xff0c;而alias命令&#xff0c;可以显示linux系统当前设定的全部别名&#xff0c;当然&#xff0c;也可以自己定义一个别名。 ali…

Kafka 中的批次

在 Kafka 中&#xff0c;批次&#xff08;Batch&#xff09; 是生产者发送消息的一个重要概念。它对 Kafka 的性能、吞吐量、延迟等有很大影响。批量处理可以使消息发送更高效&#xff0c;减少网络往返和磁盘写入的开销。 下面我将详细解释 Kafka 中的批次机制&#xff0c;包括…

联合、枚举、类型别名

数据类型&#xff1a; 已学--整数、实数、字符、字符串、数组、指针、结构待学--向量&#xff08;vector&#xff09;类型&#xff1a;优于数组非主流的类型--联合&#xff08;union&#xff09;、枚举&#xff08;enum&#xff09; 一、联合 联合类似于结构&#xff0c;可以容…

form+ffmpeg+opus录音压缩音频

说明&#xff1a; formffmpegopus录音压缩音频 效果图&#xff1a; step1:opus格式录音 C:\Users\wangrusheng\RiderProjects\WinFormsApp11\WinFormsApp11\Form1.cs using System; using System.Diagnostics; using System.IO; using System.Windows.Forms;namespace WinFo…