面试准备:排序算法大汇总 C++

排序算法总结

在这里插入图片描述

直接插入排序

取出未排序部分的第一个元素,与已排序的部分从后往前比较,找到合适的位置。将大于它的已排序的元素向后移动,将该元素插入到合适的位置。

//1. 直接插入排序
void InsertionSort(vector<int>& nums){for(int i=1;i<nums.size();i++){int key = nums[i];//取出未排序部分的第一个元素int j =i-1;// 将这个元素与已排序部分的元素从后向前比较,找到合适的位置插入while(j>=0 && nums[j]>key){nums[j+1]=nums[j];// 已排序的元素向后移动j--;}nums[j+1]=key; // 插入到正确位置}
}

希尔排序

希尔排序是一种基于插入排序的算法,通过引入间隔序列来允许交换距离较远的元素,从而对数组进行部分排序,这个过程重复进行,每次都减小间隔,直到整个数组被排序。

//2. 希尔排序,分组后组内进行直接插入排序
void shellSort(vector<int>& nums){int n = nums.size();//gap最初为n/2,然后不断减小直至为1for(int gap = n/2; gap>0 ;gap/=2){for(int i = gap ;i < n; i += 1){//获取未排序的第一个元素int key = nums[i];int j=i-gap;//前一个元素是i-gap;while(j>=0 && nums[j]>key){nums[j+gap]=nums[j];j-=gap;}nums[j+gap]=key;}}
}

冒泡排序

冒泡排序的核心思想是通过重复遍历要排序的列表,比较每对相邻的项,然后交换它们(如果它们是在错误的顺序)。这个过程重复进行,直到没有需要交换的项,这意味着列表已经排序完成。每完成一轮遍历,至少一个元素会被移动到其最终位置。

//3. 冒泡排序
void bubbleSort(vector<int>& nums){int n = nums.size();for(int i=0;i<n-1;i++){   bool flag = false;for(int j=0;j<n-i-1;j++){if(nums[j]>nums[j+1])swap(nums[j],nums[j+1]);flag = true;}if(flag==false) return; //如果这一趟没有发生任何交换,则意味已经有序。}
}

快速排序

快速排序是一种高效的排序算法,采用分治法的思想来对数组进行排序。它的基本步骤是选择一个元素作为基准(pivot),重新排列数组,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准的后面(相等的数可以到任一边)。在这个分区退出之后,该基准就处于数组的中间位置。这个过程称为分区(partition)操作。然后,递归地(recursive)把小于基准值元素的子数组和大于基准值元素的子数组排序。

//4. 快速排序
int partition(vector<int>& nums,int low, int high)
{int pivot=nums[low];int i=low;int j=high;while(i<j){// 从右向左找到第一个小于等于pivot的数   while(i<j && nums[j]>pivot){j--;}if(i<j){nums[i]=nums[j];i++;}// 从左向右找到第一个大于pivot的数while(i<j && nums[i]<pivot){i++;}if(i<j){nums[j]=nums[i];j--;}}nums[i]=pivot;// 将基准值放到正确的位置return i; // 返回基准值的位置
}void quickSort(vector<int>& nums, int low, int high){if(low<high){// pi是partitioning index,arr[pi]现在在正确的位置int pi = partition(nums,low,high);// 分区操作,并返回基准值的索引quickSort(nums,low,pi-1);//对左子树进行快速排序quickSort(nums,pi+1,high);//对右子树进行快速排序}}

简单选择排序

简单选择排序是一种直观且基础的排序算法。它的工作原理是:遍历数组,每次从未排序的部分选出最小(或最大)的元素,放到已排序部分的末尾。这个过程重复进行,直到整个数组排序完成。简单选择排序的时间复杂度为O(n^2),在任何情况下都是这样,这使得它在处理大数据集时不够高效。然而,由于其实现简单,它在数据量不大时仍然是一个不错的选择。

// 5. 简单选择排序:找到最小的元素后,和第一个元素交换
void simpleSort(vector<int>& nums)
{for(int i=0;i<nums.size();i++){// 寻找[i, n)区间里的最小值的索引int minindex=i;for(int j=0;i<nums.size();j++){if(nums[j]<nums[minindex]){minindex=j;}}swap(nums[i],nums[minindex]);}
}

堆排序

小根堆的时候是降序排列,大根堆是升序排列。

// 调整根堆,i是要调整的节点索引,n是堆的大小
void heapify(vector<int>& nums, int n, int i) {int smallest = i; // 初始化最小元素为当前节点int left = 2 * i + 1; // 左子节点int right = 2 * i + 2; // 右子节点// 如果左子节点更小,则更新最小元素的索引if (left < n && nums[left] < nums[smallest]) {smallest = left;}// 如果右子节点更小,则更新最小元素的索引if (right < n && nums[right] < nums[smallest]) {smallest = right;}// 如果最小元素不是当前节点,交换它们,并对交换后的节点进行调整if (smallest != i) {swap(nums[i], nums[smallest]);heapify(nums, n, smallest);}
}// 堆排序
void heapSort(vector<int>& nums) {int n = nums.size();//构建小根堆(从最后一个非叶子节点往上,最后一个非叶子节点是n/2-1)for(int i = n/2-1;i>=0;i--){heapify(nums,n,i);}//一个个从小根堆中取出,然后调整堆for(int i=n-1;i>0;i--){swap(nums[0],nums[i]);heapify(nums,i,0);}
}

归并排序

// 7. 归并排序
// 归并两个子数组的函数
// 第一个子数组是 arr[l..m]
// 第二个子数组是 arr[m+1..r]
// 归并排序是一种高效的排序算法,采用分治法的一个应用。
// 它将数组分成两半,对每部分递归地应用归并排序,
// 然后将两部分合并成一个有序数组。
// 这个过程包括分解数组成为越来越小的部分,
// 直至每个小部分只有一个元素,然后开始合并这些小部分,
// 使之有序,最终得到完全排序的数组。
void merge(vector<int>& nums,int l,int m,int r){int i,j,k;int n1=m-l+1;//左边的大小int n2=r-m;//右边的大小// 创建临时数组vector<int> L(n1),R(n2);// 拷贝数据到临时数组L Rfor(int i=0;i<n1;i++)L[i]=nums[l+i];for (j = 0; j < n2; j++)R[j] = nums[m + 1 + j];//归并临时数组到nums[l-r]i=0;j=0;k=l;while(i<n1 && j<n2){if (L[i] <= R[j]) {nums[k] = L[i];i++;} else {nums[k] = R[j];j++;}k++;}// 拷贝 L[] 的剩余元素while (i < n1) {nums[k] = L[i];i++;k++;}// 拷贝 R[] 的剩余元素while (j < n2) {nums[k] = R[j];j++;k++;}}
void mergeSort(vector<int>& nums, int l, int r)
{   if(l<r){int m=l+(r-l)/2;//分别对左右办部分进行排序mergeSort(nums,l,m);mergeSort(nums,m+1,r);//合并这两个部分merge(nums,l,m,r);}}

reference

https://leetcode.cn/circle/discuss/rzsN73/ 排序算法大汇总
https://mp.weixin.qq.com/s/FFsvWXiaZK96PtUg-mmtEw TOPk问题大汇总在这里插入图片描述

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

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

相关文章

力扣日记3.6-【回溯算法篇】51. N 皇后

力扣日记&#xff1a;【回溯算法篇】51. N 皇后 日期&#xff1a;2023.3.6 参考&#xff1a;代码随想录、力扣 51. N 皇后 题目描述 难度&#xff1a;困难 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将…

汽车级瞬态抑制TVS二极管优势特性及型号大全

汽车级瞬态抑制TVS二极管是一种高性能的防浪涌过电压电路保护元器件&#xff0c;能够在瞬态电压过高的情况下提供可靠的保护。它能够迅速响应并吸收过电压&#xff0c;将其导向地线&#xff0c;从而保护车辆的电子设备免受损坏。东沃汽车级TVS二极管具有以下几个关键优势&#…

javaWebssh文玩竞价管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh文玩竞价管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

如何生成带有CRC的bin文件

本文介绍如何生成带有CRC的bin文件。 MCU在上电运行时&#xff0c;通常需要校验程序是否正确&#xff08;有无篡改或烧录文件出错&#xff09;&#xff0c;一般的做法是在烧录文件&#xff08;通常是bin文件&#xff09;末尾追加CRC&#xff08;CRC-8&#xff0c;CRC-16&#…

GET 和 POST 请求:理解它们之间的区别和适用场景

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程 整理笔记 这篇就够了

素材来源视频&#xff1a;00.课程介绍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Sa4y1Z7B1/?p1&vd_sourced0ea58f1127eed138a4ba5421c577eb1 鸿蒙开发工具&#xff1a;DevEco Studio 官网地址&#xff1a;https://developer.harmonyos.com/ 目录 一、常用…

环信 Vue2 uniapp Demo重构焕新!经典再升级!

项目背景 当前官网 uni-app vue2 Demo 地址 当前版本功能实现方式较混乱&#xff0c;代码逻辑晦涩难懂&#xff0c;不利于开发者参考或复用。此实战项目主要优化现有代码结构&#xff0c;以确保未来项目的可维护性和扩展性。 重构目标 本次重构中原始 Demo 代码逻辑完全重写…

H12-821_131

131.如图所示&#xff0c;R1、R2、R3和R4运行OSPF&#xff0c;缺省情况下该网络中选举________个DR。&#xff08;请填写阿拉伯数字&#xff09; 答案&#xff1a;3 注释&#xff1a; DR是链路上的概念&#xff0c;使用路由器接口的IP地址表示。链路的网络类型是广播网络类型或…

C语言经典算法-1

C语言经典算法讲解练习 文章目录 C语言经典算法讲解练习1.汉若塔2.费式数列3. 巴斯卡三角形4.三色棋5.老鼠走迷官&#xff08;一&#xff09;6.老鼠走迷官&#xff08;二&#xff09;7.骑士走棋盘8.八皇后9.八枚银币10.生命游戏 1.汉若塔 说明&#xff1a;河内之塔(Towers of …

Fiddler入门:下载、安装、配置、抓包、customize rules

一、fiddler下载安装 安装包下载链接&#xff1a;https://www.telerik.com/download/fiddler 随便选个用途&#xff0c;填写邮箱&#xff0c;地区选择China&#xff0c;勾选“I accept the Fiddler End User License Agreement”&#xff0c;点击“DownLoad for windows”&…

Python onnxruntime推理yolov5和yolov8(最简易版)

支持yolov5和yolov8双模型 其中ChtDeploy中代码如下&#xff1a; import onnxruntime import numpy as np import cv2class ChtDeploy():def __init__(self, img_path, onnx_path, iou_threshold0.45, conf_threshold0.3, detect_w640, detect_h 640):self.img cv2.imread(im…

mysql5.7.27安装图解教程和问题

mysql 5.7.27安装教程记录如下&#xff0c;分享给大家 下载文件&#xff1a; 1.下载步骤访问官方网站&#xff1a;https://www.mysql.com/ 选择Downloads下的Community 下载对应的版本点击上图的MySQL Community Server,进入下载界面&#xff1a; 找到MySQL Community Serve…

聚观早报 | ChatGPT新增朗读功能;vivo X Fold3细节曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月6日消息 ChatGPT新增朗读功能 vivo X Fold3细节曝光 魅族21 PRO开启内测 Anthropic推出Claude 3系列 海底捞…

2024 CLion 激活,分享几个CLion 激活的方案

文章目录 CLion 公司简介我这边使用CLion 的理由CLion 最新变化主要更新AI Assistant 预览阶段结束 正式版CLion Nova 预览版更多 C 和 C 项目模型持续改进 C 代码深入了解您的代码嵌入式开发 项目模型Bazel for CLion 插件Meson 支持CMake 增强功能 _Assembly_&#xff08;程序…

HTML表单标签,文末领取面试资料

突破困境&#xff1a; 1. 提升学历 前端找工作&#xff0c;学历重要吗&#xff1f; 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧&#xff0c;本科够用&#xff0c;硕士占优&#xff0c;大专以下找到工作靠运气和真实力。 学历是硬伤&#xff0c;已经毕业的你…

SpringCloudGateway工作原理与链路图

SpringCloudGateway基本介绍 Spring Cloud Gateway 构建于Spring Boot 2.x、 Spring WebFlux和Project Reactor之上。因此,在使用 Spring Cloud Gateway 时,您可能不会应用许多熟悉的同步库(例如 Spring Data 和 Spring Security)和模式。 Spring Cloud Gateway 需要 Sprin…

Polar 到底给不给flag呢

Polar 到底给不给flag呢 开局直接给了源码 $flag flag{f73da0c8e7c774d488a6df0fec2890d9};是假的 变量覆盖&#xff0c;没啥好说的。举两个例子吧。 <?php $a "hello"; echo "$a"; //输出hello $$a"world"; echo "$…

安装mysql this application requires visual studio 2019 x64报错

提示 this application requires visual studio 2019 x64 缺少依赖 安装依赖 选择对应版本 安装 依赖安装地址 成功进入安装界面

【C语言】glibc

一、获取源码 apt install glibc-source 在Debian系统中&#xff0c;通过apt install glibc-source命令安装的glibc源码通常会被放置在/usr/src/glibc目录下。安装完成后&#xff0c;可能需要解压缩该源码包。以下是解压缩源码包的步骤&#xff1a; 1. 打开终端。 2. 切换到源…

设计MySQL数据表的几个注意点

最近合作搞项目&#xff0c;发现了很多问题。特别的&#xff0c;数据库层面上的问题更为致命。记录一下&#xff0c;希望后面看到博客的同学们注意。 注意&#xff1a;以下观点只用于一般情况下的单体、微服务&#xff0c;不保证适用所有场景。 一、ID问题 ID名称问题 如下图…