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

【数据结构】排序--选择排序(堆排序)

目录

一 堆排序

二 直接选择排序


一 堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。

需要注意的是排升序要建大堆,排降序建小堆。

直接选择排序的特性总结:

1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N * logN)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort(int* a, int n)
{//向下调整建堆//O(N)for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//堆排序//O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}int main()
{int arr[] = { 2, 3, 5, 7, 4, 6, 8};//InsertSort(arr, sizeof(arr) / sizeof(int));//排升序//InsertSort(arr, sizeof(arr) / sizeof(int));//排升序HeapSort(arr, sizeof(arr) / sizeof(int));//排升序for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d ", arr[i]);}
}

 

 

我们可以算算向下建堆的时间复杂度

 

 二 直接选择排序

直接选择排序的特性总结:

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin;int maxi = begin;for (int i = begin + 1; i <= end; i++){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[mini], &a[begin]);//检查maxi是否被换走了if (maxi == begin){maxi = mini;}Swap(&a[maxi], &a[end]);begin++;end--;}
}

本节的重点是堆排序, 对二叉树的顺序结构基础要求很高, 大家如果基础不好或者不太理解,可以看看我二叉树的博客. 

继续加油!

http://www.lryc.cn/news/193119.html

相关文章:

  • C# 图解教程 第5版 —— 第2章 C# 和 .NET Core
  • 数据结构 | Huffman TreeCode
  • mysql拼接字符串函数
  • python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域
  • 《动手学深度学习 Pytorch版》 8.6 循环神经网络的简洁实现
  • leetcode做题笔记173. 二叉搜索树迭代器
  • RPA流程自动化的优势和好处
  • 搭建 Hadoop 生态集群大数据监控告警平台
  • 课题学习(七)----粘滑运动的动态算法
  • python二次开发CATIA:测量曲线长度
  • 从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口
  • Yarn基础入门
  • element picker 时间控件,指定区间和指定月份置灰
  • thinkphp6
  • Android 13.0 USB鼠标右键改成返回键的功能实现
  • 超低延时 TCP/UDP IP核
  • Python与数据库存储
  • RN操作SQLite数据库的包(sqlite-helper.js)及其使用
  • 软件测试学习(四)自动测试和测试工具、缺陷轰炸、外包测试、计划测试工作、编写和跟踪测试用例
  • 【Rust日报】2023-10-12 论文:利用公共信息评估 Rust 代码库
  • 微信小程序入门
  • 【RocketMQ系列二】通过docker部署单机RocketMQ
  • 中缀表达式转后缀表达式
  • Zabbix 使用同一ODBC监控不同版本MySQL
  • Swagger3.0 与spring boot2.7x 整合避免swagger2.0与boot2.7冲突
  • 【HTML+REACT+ANTD 表格操作】处理(改变)数据,改变DOM
  • 【面试经典150 | 哈希表】最长连续序列
  • 如何构建安全的App网络通信?
  • Chrome插件精选 — 网页截图插件
  • react+antd封装表格组件2.0