面试准备:排序算法大汇总 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.hqwc.cn/news/506404.html

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

相关文章

加密与安全_深入了解哈希算法

文章目录 Pre概述哈希碰撞常用的哈希算法Codejava.security.MessageDigestMD5SHA-1SHA-256MessageDigest支持算法 哈希算法的用途彩虹表攻击基本原理攻击过程 防御彩虹表攻击基本原理用途 小结 Pre PKI - 01 散列(Hash)函数 概述 哈希算法&#xff08;Hash&#xff09;又称摘…

9.8分割等和子集(LC416-M)

算法&#xff1a; 可以转换为背包问题&#xff1a; 一个商品如果可以重复多次放入是完全背包&#xff0c;而只能放入一次是01背包&#xff0c;写法还是不一样的。 要明确本题中我们要使用的是01背包&#xff0c;因为元素我们只能用一次。 只有确定了如下四点&#xff0c;才能…

数字化导师坚鹏:证券公司数字化运营三步曲之认知、行动、结果

证券公司数字化运营三步曲之认知、行动、结果 课程背景&#xff1a; 很多证券公司都在开展数字化运营工作&#xff0c;目前存在以下问题急需解决&#xff1a; 不清楚证券公司数字化运营包括哪些关键工作&#xff1f; 不清楚证券公司数字化运营工作的核心方法论&#xff1f…

2024年盘点Mac上的那些强大好用的系统清理软件

现如今MacOS上的系统维护清理软件层出不穷&#xff0c;选择一款合适的系统工具是我们的当务之急&#xff0c;下边就带你盘点一下Mac上的那些优秀好用的系统清理软件&#xff0c;看看哪款你最喜欢吧&#xff01; ​ 1、App Cleaner & Uninstaller Pro App Cleaner mac版是…

Docker知识点总结

二、Docker基本命令&#xff1a; Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装&#xff0c;安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker&#xff1a; yum install docker -y -y 表示自动确认…

【精华】麻省理工学院MIT技术双月刊(Bimonthly MIT Technology Review)2024年3/4月刊荐书 Book reviews

本期内容概览见博客&#xff1a;2024年3/4月刊内容概览 Book Reviews 1. Read Write Own: Building the Next Era of the Internet By Chris Dixon (Random House, 2024) With the demise of Twitter, many have advocated for a decentralized alternative for social medi…

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用&#xff0c;gofly框架内置校验工具&#xff0c;提供开发效率&#xff0c;开发接口简单调用即可实现验证&#xff0c;下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

笨办法学 Python3 第五版(预览)(一)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 模块 1&#xff1a;Python 入门 练习 0&#xff1a;准备工作 这个练习没有代码。这只是你完成的练习&#xff0c;让你的计算机运行 Python。…

flurl升级之后没有FlurlNewtonsoftJsonSerializer

新建NewtonsoftJsonSerializer.cs /// <summary> /// ISerializer implementation based on Newtonsoft.Json. /// Default serializer used in calls to GetJsonAsync, PostJsonAsync, etc. /// </summary> public class NewtonsoftJsonSerializer : IJsonSerial…

【PDF技巧】网上下载的pdf文件怎么才能编辑

不知道大家有没有遇到过网上下载的PDF文件不能编辑的情况&#xff0c;今天我们来详细了解一下导致无法编辑的原因即解决方法有哪些。 第一种原因&#xff1a;PDF文件中的内容是否是图片&#xff0c;如果确认是图片文件&#xff0c;那么我们想要编辑&#xff0c;就可以先使用PD…

程序员把年终复盘交给AI-复利再投

1.复盘重要但不紧急 在做年末总结时&#xff0c;复盘&#xff0c;改进计划&#xff0c;这是我觉得最重要的一段时间&#xff0c;它不紧急&#xff0c;但是极其重要。 年底的复盘就像把今年的收获&#xff0c;转移到一个复利账户里&#xff0c;提取的经验越多&#xff0c;来年…

论文阅读_代码生成模型_CodeLlama

英文名称: Code Llama: Open Foundation Models for Code 中文名称: Code Llama&#xff1a;开放基础代码模型 链接: https://arxiv.org/abs/2308.12950 代码: https://github.com/facebookresearch/codellama 作者: Baptiste Rozire, Jonas Gehring, Fabian Gloeckle, Sten So…