数据结构与算法之选择排序
每次 从待排序序列中选择出一个最大(或者最小)的记录添加到有序序列的后面即为选择排序。
选择排序主要有:简单选择排序、树形选择排序、堆排序。
1、简单选择排序
基本思路:重复进行n趟选择,第i趟通过n-i次记录的比较,在n-i+1个记录中选取最小(或最大)的记录与第i个记录进行交换。
void selectSort(int arr[],int n){ int outer,inner; int min; for(outer=1;outer<=n;outer++ ){ min = outer; for(inner=outer;inner<=n;inner++) if(arr[inner]<arr[min]) min = inner; if(min != outer){ arr[0] = arr[min]; arr[min] = arr[outer]; arr[outer] = arr[0]; } } }
2、堆排序
堆:(1) 堆是完全二叉树;
(2) 小根堆:每个结点的值小于等于左右孩子结点的值;大根堆:每个结点的值大于等于左右孩子结点的值。
堆排序:对于大根堆来说,堆顶记录即是整个序列的最大值。我们将待排序序列构造成一个堆,选出堆顶记录(最大值),然后把剩下的记录重新调整成堆,再选择出堆顶记录(次大值),依次下去,直到堆中只剩下一个记录。
void shiftHeap(int arr[],int k,int m){ int i = k; int j = i * 2; while(j <= m){ if(j<m && arr[j]<arr[j+1]) j++; if(arr[i]>arr[j]) break; else{ arr[0] = arr[i]; arr[i] = arr[j]; i = j; j = 2 * i; } } } void heapSort(int arr[],int n){ int index; for(index = n/2;index>=1;index--) shiftHeap(arr,index,n); for(index=1;index<n;index++){ arr[0] = arr[1]; arr[1] = arr[n-index+1]; arr[n-index+1] = arr[0]; shiftHeap(arr,1,n-index); } }
3、总结
简单选择排序:时间复杂度为o(n2),是不稳定排序。
堆排序:时间复杂度为o(nlog2n),是不稳定排序。
堆排序其实就是每次选择待排序序列中的最大值(或最小),它与简单选择排序的区别就是:简单选择排序是通过比较n-i+1个记录来选择最值,而堆排序是通过构造堆来选择最值。所以堆排序最重要的就是调整成堆的过程。
每一个不曾起舞的日子里都是对以往生命的辜负!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端