排序算法,咕咕咕

1.选择排序

void selectsort(vector<int>& v)
{
for(int i=0;i<v.size()-1;i++)
{int mini=i;for(int j=i+1;j<v.size();j++){if(v[i]>v[j]){mini=j;}}if(mini!=i)swap(v[i],v[mini]);
}
}

2.堆排序

void adjustdown(vector<int>& v,int root,int size)
{
int largest=root;
int left=2*root+1;
int right=2*root+2;
if(left<size&&v[left]>v[largest]) largest=left;
if(right<size&&v[right]>v[largest]) largest=right;
if(largest!=root)
{swap(v[root],v[largest]);adjustdown(v,largest,size);
}}
void heapsort(vector<int>& v)
{
int n=v.size();
for(int i=n/2-1;i>=0;i--)    非叶子结点
{adjustdown(v,i,n);
}
for(int i=n-1;i>0;i--)       大堆只是父结点大于子节点,相邻子节点不一定大于
{
swap(v[i],v[0]);
adjustdown(v,0,n);
}
}

3.插入排序

void insertsort(vector<int>& v)
{int n=v.size();for(int i=1;i<n;i++){int key=v[i];int j=i-1;while(j>=0&&v[j]>key){v[j+1]=v[j];j--;}v[j+1]=key;}
}

4.希尔排序

void shellsort(vector<int>& v)
{int n=v.size();int gap=1;while(gap<n/3){gap=gap*3+1;}for(;gap>0;gap=(gap-1)/3){for(int i=gap;i<n;i++){int key=v[i];int j=i-gap;while(j>=0&&v[j]>key){v[j+gap]=v[j];j-=gap;}v[j+gap]=key;}}
}

5.冒泡排序

void bubblesort(vector<int>& arr)
{for(int i=0;i<arr.size()-1;i++){for(int j=0;j<arr.size()-1-i;j++){if(arr[j]>arr[j+1]){swap(arr[j],arr[j+1]);}}}
}

6.快速排序

//快速排序 hoare法
int findkeyi(vector<int>& arr,int left,int right)
{
int pivot=arr[left];
int i=left-1;
int j=right+1;
while(true)
{do{i++;}while(arr[i]<pivot);do{j++;}while(arr[j]>pivot);if(i>=j) return j;swap(arr[i],arr[j]);
}
}
void quicksort(vector<int>& arr,int left,int right)
{
if(left<right)
{int gugu=findkeyi(arr,left,right);quicksort(arr,left,gugu);quicksort(arr,gugu+1,right);
}
}
//挖坑法
int findkeyi(vector<int>& arr,int left,int right)
{int pivot=arr[left];int hole=left;while(left<right){while(left<right&&arr[right]>=pivot) right--;arr[hole]=arr[right];hole=right;while(left<right&&arr[left]<=pivot) left++;arr[hole]=arr[left];hole=left;}arr[hole]=pivot;return hole;
}
void quicksort(vector<int>& arr,int left,int right)
{if(left<right){int gugu=findkeyi(arr,left,right);quicksort(arr,left,gugu-1);quicksort(arr,gugu+1,right);}
}
//lomuto
int findkeyigugu(vector<int>& arr,int left,int right)
{int pivot=arr[right];int i=left-1;for(int j=left;j<right;j++){if(arr[j]<pivot){i++;swap(arr[i],arr[j]);}}swap(arr[i+1],arr[right]);return i+1;
}
void quicksort(vector<int>& arr,int left,int right)
{if(left<right){int gugu=findkeyi(arr,left,right);quicksort(arr,left,gugu-1);quicksort(arr,gugu+1,right);}
}
//非递归双指针
void quicksort(vector<int>& arr,int left,int right)
{stack<pair<int,int>> st;st.push({left,right});while(!st.empty()){auto [l,r]=st.top();st.pop();if(l>=r) continue;int gugu=findkeyigugu(arr,l,r);st.push({gugu+1,r});st.push({l,gugu-1});}
}

7.归并排序

void merge(vector<int>& arr,int left,int mid,int right)
{int n1=mid-left+1;int n2=right-mid;vector<int> gu(n1),gugu(n2);for(int i=0;i<n1;i++){gu[i]=arr[left+i];}for(int j=0;j<n2;j++){gugu[j]=arr[mid+1+j];}int i=0;int j=0;int k=left;while(i<n1&&j<n2){if(gu[i]<gugu[j]){arr[k]=gu[i];i++;}else{arr[k]=gugu[j];j++;}k++;}while(i<n1){arr[k]=gu[i];i++;k++;}while(j<n2){arr[k]=gugu[j];k++;j++;}
}
void mergesort(vector<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);}
}

8.计数排序

void countingsort(vector<int>& arr)
{if(arr.empty()) return;int min=*min_element(arr.begin(),arr.end());int max=*max_element(arr.begin(),arr.end());int l=max-min+1;vector<int> result(l,0);for(int num:arr){result[num-min]++;      每个数出现了几次,哈希的思想}int index=0;for(int i=0;i<l;i++){int num=i+min;while(result[i]>0){arr[index]=num;result[i]--;index++;}}
}

9.总结

  • 选择排序:简单直观,每次选最小元素交换,时间复杂度 O (n²),不稳定。
  • 堆排序:利用堆的特性,时间复杂度 O (n log n),空间复杂度 O (1),不稳定。
  • 插入排序:适合近乎有序的数据,时间复杂度 O (n²),稳定。
  • 希尔排序:插入排序的优化版,通过增量分组减少移动次数,时间复杂度与增量有关,不稳定。
  • 冒泡排序:通过相邻元素交换 “浮” 出最大元素,时间复杂度 O (n²),稳定(可优化)。
  • 快速排序:分治法的典型应用,平均时间复杂度 O (n log n),最坏 O (n²),不稳定,有多种分区实现(hoare、挖坑、lomuto 等)。
  • 归并排序:分治法,时间复杂度 O (n log n),空间复杂度 O (n),稳定。
  • 计数排序:非比较排序,适合范围小的整数,时间复杂度 O (n + k),稳定(标准实现)。

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

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

相关文章

数据库查询系统——pyqt+python实现Excel内查课

一、引言 数据库查询系统处处存在&#xff0c;在教育信息化背景下&#xff0c;数据库查询技术更已深度融入教务管理场景。本系统采用轻量化架构&#xff0c;结合Excel课表&#xff0c;通过PythonPyQt5实现跨平台桌面应用&#xff0c;以实现简单查课效果。 二、GUI界面设计 使用…

base64魔改算法 | jsvmp日志分析并还原

前言 上一篇我们讲了标准 base64 算法还原&#xff0c;为了进一步学习 base64 算法特点&#xff0c;本文将结合 jsvmp 日志&#xff0c;实战还原出 base64 魔改算法。 为了方便大家学习&#xff0c;我将入参和上篇文章一样&#xff0c;入参为 Hello, World!。 插桩 在js代码中&…

vue3笔记(2)自用

目录 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念与用法 1. 安装与初始化 2. 创建 Store 3. 在组件中使用 Store 4. 高级用法 5、storeToRefs 二、Pinia 与 Vuex 的主要区别 三、为什么选择 Pinia&#xff1f; 三、定义全局指令 1.封装通用 DOM 操作&#…

大模型面试回答,介绍项目

1. 模型准备与转换&#xff08;PC端/服务器&#xff09;你先在PC上下载或训练好大语言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型转换成瑞芯微NPU能用的专用格式&#xff08;.rkllm&#xff09;&#xff0c;并可选择量化优化。把转换好的模型文件拷…

Oracle 19.20未知BUG导致oraagent进程内存泄漏

故障现象查询操作系统进程的使用排序&#xff0c;这里看到oraagent的物理内存达到16G&#xff0c;远远超过正常环境&#xff08;正常环境在19.20大概就是100M多一点&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

尝试几道算法题,提升python编程思维

一、跳跃游戏题目描述&#xff1a; 给定一个非负整数数组 nums&#xff0c;你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例&#xff1a;输入&#xff1a;nums [2,3,1,1,4] → 输出&#xff1a;True输入…

【菜狗处理脏数据】对很多个不同时间序列数据的文件聚类—20250722

目录 具体做法 可视化方法1&#xff1a;PCA降维 可视化方法2、TSNE降维可视化&#xff08;非线性降维&#xff0c;更适合聚类&#xff09; 可视化方法3、轮廓系数评判好坏 每个文件有很多行列的信息&#xff0c;每列是一个驾驶相关的数据&#xff0c;需要对这些文件进行聚类…

Qwen-MT:翻得快,译得巧

我们再向大家介绍一位新朋友&#xff1a;机器翻译模型Qwen-MT。开发者朋友们可通过Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;来直接体验它又快又准的翻译技能。 本次更新基于强大的 Qwen3 模型&#xff0c;进一步使用超大规模多语言和翻译数据对模型进行训练…

在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案

SQL语句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;关键说明&#xff1a;核心函数&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 将字符串转为日期类型TO_CHAR(..., YYYY-MM-DD) → 格式化为 2015-03-30处理中文月份&a…

pnpm运行electronic项目报错,npm运行正常。electronic项目打包为exe报错

pnpm运行electronic项目报错 使用 pnpm 运行 electronic 项目报错&#xff0c;npm 运行正常&#xff0c;报错内容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8️⃣ 高级特性—— 列表生成式

文章目录&#x1f9e0; 总结1. 基本语法2. 加筛选条件&#x1f501; 双层循环&#xff08;全排列&#xff09;&#x1f4c2; 遍历目录&#x1f511; 遍历字典&#x1f521; 转小写3. if 和 if...else 的区别4. 练习题&#x1f9e0; 总结 特性用法示例基础语法[x for x in iter…

DocC的简单使用

DocC的简单使用 在写3GShare中&#xff0c;由于刚开始使用MVC模式来写东西&#xff0c;对很多东西都不是很熟&#xff0c;经常写着写着就忘了自己在写什么&#xff0c;所以学了一下DocC来加快开发进度 什么是DocC 简单来说&#xff0c;DocC就是更高级的注释&#xff0c;虽然…

深入理解C语言快速排序与自省排序(Introsort)

排序算法是计算机科学中最基础也是最重要的知识之一。快速排序&#xff08;Quicksort&#xff09;因其平均时间复杂度为 O(n log n) 而广受欢迎&#xff0c;但在最坏情况下会退化到 O(n)。为了克服这一缺点&#xff0c;自省排序&#xff08;Introsort&#xff09; 应运而生&…

C#编程基础:运算符与结构详解

目录 一.关系运算符 常见关系运算符 二.逻辑运算符 常见逻辑运算符 1. 逻辑与&#xff08;&& 或 and&#xff09; 2. 逻辑或&#xff08;|| 或 or&#xff09; 3. 逻辑非&#xff08;! 或 not&#xff09; 运算符优先级 三.if语句 1.c#程序的三大结构 1.顺序…

嵌入式学习-土堆目标检测(3)-day27

再学一个labelme在labelstudio环境中再pip install labelme安装好后直接输入 labelme之后点击保存&#xff0c;选择保存文件地址还有一个就是将labelme的格式转化为yolo格式还是在labelstudio这个环境里面安装pip install labelme2yolo

Qt OpenGL 集成:开发 3D 图形应用

Qt 提供了完善的 OpenGL 集成方案&#xff0c;使开发者能够在 Qt 应用中高效开发 3D 图形应用。通过 Qt 的 OpenGL 模块&#xff0c;可简化 OpenGL 上下文管理、窗口渲染和跨平台适配&#xff0c;同时结合现代 OpenGL 特性&#xff08;如着色器、顶点缓冲、纹理等&#xff09;实…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词评论查询功能实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解热词评论查询功能实现 视频在线地址&#…

使用 Google Earth 的 DEM — 教程。

数字高程模型 (DEM)描绘了已知高程点之间的表面高程。本教程将向您展示如何使用 Google Earth 的高程数据生成 DEM。在当今世界&#xff0c;DEM 主要用于 GIS 应用。 当然&#xff0c;我们可以从美国地质调查局 (USGS) 网站下载数字高程模型 (DEM)。但如果我们想知道某个地点的…

在 UniApp 中实现中间凸起 TabBar 的完整指南

如何在 UniApp 中设置中间 TabBar 凸起效果 在移动应用开发中&#xff0c;TabBar 是常见的导航组件&#xff0c;而中间凸起的 TabBar 按钮则是一种流行的设计风格&#xff0c;常用于突出重要功能&#xff08;如发布、拍照等&#xff09;。UniApp 提供了 midButton 属性&#xf…

微观低代码

今日去深圳的一家工厂给客户做培训&#xff0c;主要培训内容为低代码产品的二开和功能演示。客户使用了20年的ERP和OA系统&#xff0c;目前想对接到低代码平台。客户目前想实现的主要功能是&#xff0c;对接OA的单点登录&#xff0c;把ERP的功能迁移到低代码平台上来工厂规模比…