算法——排序(六)堆排序
来源:互联网 发布:wine在linux上怎么用 编辑:程序博客网 时间:2024/05/04 11:04
堆排序
1、时间复杂度O(nlogn) O(nlogn),空间复杂度O(1),不稳定!!!
2、基本原理:
输出堆顶的最小元素以后,使得剩余的m-1个元素的序列有建立一个堆,得到m-1个元素中的次小值,反复执行下去就得到一个有序堆,这个过程就是堆排序。
两个关键步骤:
筛选(自堆顶至叶子结点自上而下调整合适位置的过程);
从无序序列建堆(反复筛选的过程,对于n个元素只需从n/2个元素向前进行筛选即可);
(堆:完全二叉树中所有非终端结点元素都小于或者大于其父母结点即可)
3.为了建立从小到大的序列,需要建立大顶堆;
#include <iostream>using namespace std;void HeapAdjust(int *l,int s,int m)//s是需要调整的堆元素的位置,m是堆的元素个数//s不能是0(数组中的第一个元素),2s表示孩子节点还是0是错误的{ int rc=l[s]; for(int j=2*s;j<=m;j=j*2) { if(j<m&&(l[j]<l[j+1])) ++j; if(l[j]<=rc) break; l[s]=l[j]; s=j; } l[s]=rc;}void HeapSort(int *l,int m){ for(int j=m/2;j>=1;--j) { HeapAdjust(l,j,m); } for(int i=m;i>1;--i) { swap(l[1],l[i]); HeapAdjust(l,1,i-1); }}int main(){ int l[100],n=0; cout<<"输入数据的大小:"<<endl; cin>>n; cout<<"输入需要排序的数据:"<<endl; for(int i=1;i<=n;i++){ cin>>l[i]; } HeapSort(l,n); cout<<"排序后数据:"<<endl; for(int i=1;i<=n;i++){ cout<<l[i]<<endl; } return 0;}
0 0
- 复习数据结构:排序算法(六)——堆排序
- 排序算法(六)——堆排序
- 算法——排序(六)堆排序
- 排序算法(六):堆排序
- 排序算法(六) 堆排序
- 基础算法系列(六)——堆排序
- 堆排序----(排序算法六)
- 排序算法—堆排序
- 重新教自己学算法之递归排序——堆排序(六)
- 排序算法—堆和堆排序
- 八种排序方法(六)——堆排序
- 常用算法总结之排序(六)----堆排序
- Java排序算法总结(六):堆排序
- Java排序算法总结(六):堆排序
- Java排序算法总结(六):堆排序
- 排序算法之六 堆排序
- 排序算法——堆排序算法
- 排序(六)-堆排序
- iOS实用方法集锦(二)
- linux配置git,操作github代码
- cocos lua 关于error: syntax error during pre-compilation
- 二位数组中的查找
- Android之AsyncTask的使用
- 算法——排序(六)堆排序
- linux基础命令回顾
- cocos2dx-精灵如何被渲染and纹理如何被管理、产生与销毁
- 【转载】身份证号码验证算法
- java 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 读书笔记1 oracle architecture overview
- Leetcode 14: Longest Common Prefix
- RecyclerView使用详解(一)
- Javascript基本介绍