当前位置: 首页 > news >正文

交换排序、归并排序、计数排序

冒泡排序:

void BubbleSort(int* a, int n)
{//第一层循环是趟数,第二层是交换for (int i = 0; i <= n-2; i++){int flag = 0;for (int j = 0; j <= n - 2 - i; j++){if (a[j] > a[j + 1]){swap(&a[j], &a[j + 1]);flag = 1;}}if (flag == 0){break;}
}
}

这里做了一个小优化,通过flag的值来减少运行趟数,防止已经有序的情况下继续比较,最坏时间复杂度N方,最好时间复杂度o(N) ,具有稳定性

快速排序:

void _QuickSort1(int* a, int left, int right)
{int key = left; int begin = left, end = right;if (begin >=end){return;}三数取中法//int mid =Getmid(a, left, right);//swap(&a[left], &a[mid]);//随机数法//int randi = rand() % (right - left) + left;//swap(&a[randi], &a[left]);while (begin<end){while (begin<end){if (a[key] <= a[end])//一定保证右边先走{end--;}else{break;}}while (begin<end){if (a[key] >=a[begin]){begin++;}else{break;}}swap(&a[begin], &a[end]);}swap(&a[left], &a[begin]);key = begin;_QuickSort1(a, 0, key - 1);_QuickSort1(a, key + 1, right);
}

快排时间复杂度是o(nlogn),但是当整个数组为有序序列时,快排时间复杂度就为N方,所以这里有三数取中法和随机数法, 使key的值变得随机,这里更推荐三数取中,因为交换后所得到的值肯定为中间值,但有一种特殊情况,就是整个数列中的数都为同一个值,这时候时间复杂度只能为N方,具有不稳定性

三数取中法

int Getmid(int* a, int left, int right)
{int mid = (left + right) / 2;if (a[left] > a[mid]){if (a[mid] > a[right]) {return mid;}else if (a[left] > a[right]){return right;}else{return left;}}else{if (a[left] > a[right]){return left;}else if (a[right] < a[mid]){return right;}else{return mid;}}
}

随机数法 

//随机数法//int randi = rand() % (right - left) + left;

快排双指针法:

void _QuickSort2(int* a, int left, int right)
{if (left >= right){return;}int key = left;int prev = left;int cur = left+1;while (cur <= right){if (a[cur] < a[key] && ++prev != cur){swap(&a[prev], &a[cur]);}cur++;}swap(&a[key], &a[prev]);key = prev;_QuickSort2(a, 0, key - 1);_QuickSort2(a, key + 1, right);
}

 相比最原始的快排更好理解,代码量也少

 快排非递归

void _QuickSort(int* a, int n)
{ST st;STInit(&st);STPush(&st, n-1);STPush(&st, 0);while (!STEmpty(&st)){int left = STTop(&st);STPop(&st);int right = STTop(&st);STPop(&st);int key = left;int prev = left;int cur = left + 1;while (cur <= right){if (a[cur] < a[key] && ++prev != cur){swap(&a[prev], &a[cur]);}cur++;}swap(&a[key], &a[prev]);key = prev;if ((key+1)<right){STPush(&st, right);STPush(&st, key + 1);}if (left<(key-1)){STPush(&st, key - 1);STPush(&st, left);}}STDestroy(&st);
}

当递归次数太多时会建立大量函数栈帧,所以在这里实现快排的非递归排序,这里用到了栈的知识 ,模拟了快排的递归过程,类似于二叉树的前序遍历,运用队列也可以实现,但队列是模拟了二叉树的层序遍历,快排的本质还是前序遍历

归并排序:

void _MergeSort(int* a, int left, int right,int*tem)
{if (left>= right){return;}int mid = (left + right) / 2;int begin1 = left;int end1 = mid;int begin2 = mid + 1;int end2 = right;_MergeSort(a, left, mid, tem);_MergeSort(a, mid + 1, right, tem);int i = begin1;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tem[i++]=a[begin1++];}else{tem[i++] = a[begin2++];}}while (begin1 <= end1){tem[i++] = a[begin1++];}while (begin2 <= end2){tem[i++] = a[begin2++];}memcpy(a + left, tem + left,sizeof(int)*( right - left + 1));
}

 时间复杂度nlogn,具有稳定性

归并排序的非递归 

void _MergeSort1(int* a, int n)
{int* tem = (int*)malloc(sizeof(int) * n);if (tem == NULL){perror("malloc fail");return;}int gap = 1;//gap是每组长度,长度等于n的时候不用归并,理解本质while (gap < n){for (int i = 0; i <n; i+=2*gap){int left = i;int right = i + 2 * gap - 1;int begin1 = i;int end1 = i + gap - 1;int begin2 = end1 + 1;int end2 = begin2 + gap - 1;int j = begin1;if (end1 >= n-1 || begin2 >= n){break;}if (end2 >=n){end2 = n - 1;}while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tem[j++] = a[begin1++];}else{tem[j++] = a[begin2++];}}while (begin1 <= end1){tem[j++] = a[begin1++];}while (begin2 <= end2){tem[j++] = a[begin2++];}memcpy(a + left, tem + left, sizeof(int) * (end2 - left + 1));//end2可能会变,这里不能用right减}gap *= 2;}free(tem);tem = NULL;
}

计数排序

void CountSort(int* a, int n)
{int min = a[0], max =a[ 0];for (int i = 1; i < n; i++){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int range = max - min + 1;int* count = (int*)calloc(sizeof(int),range);if (count == NULL){return;}for (int i = 0; i < n; i++){count[a[i]-min]++;//出现几次}int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}

时间复杂度o(n+range),空间复杂度 o(range),比较适合处理相对集中的数据,计数排序只能对整数排序,所以这里不讨论其稳定性

 

 

相关文章:

交换排序、归并排序、计数排序

冒泡排序&#xff1a; void BubbleSort(int* a, int n) {//第一层循环是趟数&#xff0c;第二层是交换for (int i 0; i < n-2; i){int flag 0;for (int j 0; j < n - 2 - i; j){if (a[j] > a[j 1]){swap(&a[j], &a[j 1]);flag 1;}}if (flag 0){break;…...

怎么查看 iOS ipa包 mobileprovision 改动

查看 iOS .ipa 包中的 .mobileprovision 文件&#xff08;即配置文件或描述文件&#xff09;的改动&#xff0c;可以通过以下步骤进行&#xff1a; 重命名 .ipa 文件&#xff1a;将 .ipa 文件扩展名改为 .zip。例如&#xff0c;如果文件名为 MyApp.ipa&#xff0c;则重命名为 M…...

【Unitydemo制作】音游制作—控制器与特效

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…...

[程序员] 最近的感悟,错误处理占大头?

根据昨天分享的一个问题&#xff0c;想到的。 在代码里&#xff0c;异常处理的代码也算是占大头&#xff0c;扑面而来的就是发生错误时怎么处理的大片代码&#xff1b;而且出现问题的概率是绝对的占大头。所以&#xff0c;异常代码出现bug的概率也在不知不觉中增加&#xff01…...

vue3(一) - 结构认识

通过之前博客应该已经完成了vue脚手架的认识和创建&#xff08;地址&#xff09;&#xff0c;这节我们简单介绍一下需要使用的一些关键技术&#xff0c;后续在详细介绍 结构目录 创建脚手架时&#xff0c;我选择了TypeScript,store,route这三个选项 index.html入口 node_mo…...

数据库迁移——kettle开发01

背景&#xff1a;数据库的多种多样&#xff0c;在搭建项目之初&#xff0c;并没有详细考虑到数据库的建设&#xff0c;当增加配置不能满足业务场景需要时&#xff0c;这时候考虑到使用更高性能的数据库&#xff0c;如将MySQL更换为oracle数据库。或者在搭建新项目时&#xff0c…...

Netty: Netty中的组件

文章目录 一、EventLoop1、EventLoop2、EventLoopGroup&#xff08;1&#xff09;处理普通时间和定时任务&#xff08;2&#xff09;处理IO任务 二、Channel三、Future&Promise四、Handler&Pipeline五、ByteBuf 一、EventLoop 1、EventLoop EventLoop本质是一个单线程…...

Julia编程01:Julia语言介绍

在2020上半年&#xff0c;因为疫情无法返校&#xff0c;所以在家待了半年&#xff0c;期间学习一点了R语言、Python、Julia、linux和C语言&#xff0c;只是学习基础语法并没有项目练习&#xff0c;因此返校半年后差不多都不记得了&#xff0c;现在重新捡起Julia丰富下当时写的笔…...

二叉树顺序结构及链式结构

一.二叉树的顺序结构 1.定义&#xff1a;使用数组存储数据&#xff0c;一般使用数组只适合表示完全二叉树&#xff0c;此时不会有空间的浪费 注&#xff1a;二叉树的顺序存储在逻辑上是一颗二叉树&#xff0c;但是在物理上是一个数组&#xff0c;此时需要程序员自己想清楚调整…...

【Python】pandas连续变量分箱

路过了学校花店 荒野到海边 有一种浪漫的爱 是浪费时间 徘徊到繁华世界 才发现你背影 平凡得特别 绕过了城外边界 还是没告别 爱错过了太久 反而错得完美无缺 幸福兜了一个圈 &#x1f3b5; 林宥嘉《兜圈》 import pandas as pd import numpy as np from sklearn.model_selecti…...

Qt 打卡小程序总结

1.Qt::Alignment&#xff08;枚举类型&#xff09;用于指定控件或文本的对齐方式 Qt::AlignLeft&#xff1a;左对齐。Qt::AlignRight&#xff1a;右对齐。Qt::AlignHCenter&#xff1a;水平居中对齐。Qt::AlignTop&#xff1a;顶部对齐。Qt::AlignBottom&#xff1a;底部对齐。…...

【qt】标准项模型

标准项模型 一.使用标准型项模型1.应用场景2.界面拖放3.创建模型4.配套模型5.视图设置模型6.视图属性的设置 二.从文件中拿到数据1.文件对话框获取文件名2.创建文件对象并初始化3.打开文件对象4.创建文本流并初始化5.读取文本流6.关闭文件7.完整代码 三.为模型添加数据1.自定义…...

一文深度剖析 ColBERT

近年来&#xff0c;向量搜索领域经历了爆炸性增长&#xff0c;尤其是在大型语言模型&#xff08;LLMs&#xff09;问世后。学术界开始重点关注如何通过扩展训练数据、采用先进的训练方法和新的架构等方法来增强 embedding 向量模型。 在之前的文章中&#xff0c;我们已经深入探…...

css左右滚动互不影响

想实现左右都可以滚动&#xff0c;且互不影响。 只需要再左边的css里面 .threedlist {cursor: pointer;width: 280px;position: fixed;height: 100vh; /* 定义父容器高度 */overflow-y: auto; /* 只有在内容超过父容器高度时才出现滚动条 */} 如果想取消滚动条样式 .threedli…...

【linux-uboot移植-mmc及tftp启动-IMX6ULL】

目录 1. uboot简介2. 移植前的基本介绍&#xff1a;2.1 环境系统信息: 3. 初次编译4. 烧录编译的u-boot4.1 修改网络驱动 5. 通过命令启动linux内核5.1 通过命令手动启动mmc中的linux内核5.1.1 fatls mmc 1:15.1.2 fatload mmc 1:1 0x80800000 zImage5.1.3 fatload mmc 1:1 0x8…...

Python-温故知新

1快速打开.ipynb文件 安装好anaconda后&#xff0c;在需要打开notebook的文件夹中&#xff0c; shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面&#xff1a; 2 快速查看函数用法 光标放在函数上——shift键tab 3......

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

5月23日&#xff0c;绿联科技举行了“新一代存储方式未来已来”发布会&#xff0c;发布了绿联NAS私有云DXP系列&#xff08;包括两盘位到八盘位的九款新品&#xff09;以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品&#xff0c;共有两盘位、四盘位、…...

力扣:242. 有效的字母异位词

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram"…...

设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式&#xff08;Composit…...

MyBatis面试题(Mybaits的优点、缺点、适用场合、与Hibernate有哪些不同)

一、Mybaits的优点&#xff1a; 1、基于 SQL 语句编程&#xff0c;相当灵活&#xff0c;不会对应用程序或者数据库的现有设计造成任 何影响&#xff0c;SQL 写在 XML里&#xff0c;解除 sql与程序代码的耦合&#xff0c;便于统一管理&#xff1b;提供 XML 标签&#xff0c;支持…...

实战指南:用Python的pyttsx3库打造你的专属语音助手

1. 从零认识pyttsx3&#xff1a;你的代码会说话 第一次听到电脑用标准播音腔朗读出我写的文字时&#xff0c;那种感觉就像小时候收到会说话的生日贺卡。pyttsx3这个神奇的Python库&#xff0c;能让任何文本通过声卡变成人声。不同于需要联网的语音合成服务&#xff0c;它完全离…...

学术效率倍增:Zotero插件全生命周期管理的创新实践

学术效率倍增&#xff1a;Zotero插件全生命周期管理的创新实践 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 一、…...

2026 Java AI框架选型:Spring AI/LangChain4j企业级对比

文章目录引子&#xff1a;Java程序员的"AI焦虑"一、血统与基因&#xff1a;两个截然不同的"家族遗传"1.1 Spring AI&#xff1a;Spring生态的"嫡长子"1.2 LangChain4j&#xff1a;Java AI界的"瑞士军刀"二、代码实战&#xff1a;同样的…...

一种改进的鹈鹕优化算法(IPOA)用于函数寻优研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…...

制造业上线Agent,能获得哪些核心价值?——2026工业AI从“辅助决策”迈向“全自主执行”的深度解析

站在2026年这个时间节点回望&#xff0c;制造业的数字化转型已完成了从“数据上云”到“智能入链”的惊人跨越。如果说过去十年的工业互联网核心是解决“连接”问题&#xff0c;那么2026年全面爆发的AI Agent&#xff08;智能体&#xff09;则彻底解决了“执行”问题。在当前的…...

【VLA】Vision Language Action

文章目录一、什么是世界模型&#xff08;World Model&#xff09;&#xff1f;✅ 定义&#xff1a;&#x1f30d; 核心功能&#xff1a;&#x1f527; 技术原理&#xff08;典型架构&#xff09;&#xff1a;二、世界模型在具身智能中的作用三、VLA&#xff08;Vision-Language…...

BES-XGBoost多变量时间序列预测的‘秃鹰搜索优化算法‘与交叉验证抑制过拟合问题的Mat...

基于秃鹰搜索优化算法优化XGBoost(BES-XGBoost)的多变量时间序列预测 BES-XGBoost多变量时间序列 采用交叉验证抑制过拟合问题 优化参数为迭代次数、最大深度和学习率 matlab代码&#xff0c;注&#xff1a;暂无Matlab版本要求 -- 推荐 2016B 版本及以上 注&#xff1a;采用 XG…...

OpCore-Simplify:技术赋能Hackintosh的开源工具革命

OpCore-Simplify&#xff1a;技术赋能Hackintosh的开源工具革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款革命性的开源工…...

Claude Code 官方回应代码泄漏:这次,他们没有“甩锅人”

这两天&#xff0c;Claude Code 的“代码泄漏”事件在技术圈引发了不少讨论。各种版本的故事层出不穷&#xff0c;甚至还有营销号声称“新员工背锅被开除”。但从官方回应来看&#xff0c;事情的走向&#xff0c;其实完全不一样。&#x1f449; Claude Code 团队&#xff0c;正…...

从物流小哥,转行网络安全,是我这辈子最成功的选择

从月薪4000的物流小哥成功转行到月入上万的网络安全工程师&#xff0c;我是怎么做到的&#xff0c;下面说说我的亲身经历。 我叫阿强&#xff0c;我是26岁转行学网安的。说实在&#xff0c;转行就是奔着挣钱去的。我三流大学毕业&#xff0c;物流专业&#xff0c;学习能力一般…...