写堆排序的动机

自从学了堆以来,对于堆用得最多的就是STL的map,set以及优先队列,而最基本的堆构建,堆调整都没有动作做过,趁着找实习的阶段复习一下堆,实现一个堆排序。


堆介绍

堆是一个完全二叉树,也就是说,整棵树除了叶子最底层的叶子节点之外,都是填满的,而最底层的叶子节点由左到右不能有空隙。也就是除了底层,每一层都是满的,底层必须从左到右填数。而最大堆必须满足父节点大于子节点,最小堆则相反。对于堆的插入和删除都是Log(N)的时间复杂度。


堆排序思路

堆排序的思想就是先构建一个最大堆,然后不断对堆进行pop操作,把最大值pop到队列尾部。最大堆最大的特点是”子承父业“。当子节点大于父节点时候,子代替父上一线;当父节点被“提升”时候找到最大的子节点补入,剩下的空缺依次不上,遇到没有后代的时候把最后的数过继过来。由于堆是一个完全二叉树,所以堆有一个很重要的特性,就是节点i的子节点分别是i*2 + 1和i*2+2,所以并不需要真正构建一棵树。


代码

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm> using namespace std;
void swap(int &num1,int &num2){if(num1 != num2){num1 ^= num2;num2 ^= num1;num1 ^= num2;}
}
void insert(vector<int> &arr_sort){//构建一个最大堆 for(int i = 1;i < arr_sort.size();i ++){int j = i;while(arr_sort[j] > arr_sort[(j - 1)/ 2]){swap(arr_sort[j],arr_sort[(j - 1)/2]);j = (j - 1)/2; }}
} void pop(vector<int> &arr_sort){for(int i = 0;i < arr_sort.size();i ++){int tmp = arr_sort[0],j = 0;while(j * 2 + 2 <= arr_sort.size() - i - 1){if(arr_sort[j * 2 + 1] > arr_sort[j * 2 + 2]){arr_sort[j] = arr_sort[j * 2 + 1];j = j * 2 + 1;}else{arr_sort[j] = arr_sort[j * 2 + 2];j = j * 2 + 2;}}arr_sort[j] = arr_sort[arr_sort.size() - i - 1];while(arr_sort[j] > arr_sort[(j - 1)/ 2]){swap(arr_sort[j],arr_sort[(j - 1)/2]);j = (j - 1)/2; }arr_sort[arr_sort.size() - i - 1] = tmp;}
}void initVec(vector<int> &vec) {srand((unsigned)time(NULL)); int len = rand() % 1000;for(int i = 0; i < len; i ++) {vec.push_back(rand() % 1000);}
}void heap_sort(vector<int> &vec) {insert(vec);pop(vec);
}void print(vector<int> vec) {for(int i = 0;i < vec.size();i ++) {cout << vec[i] << " ";}cout << endl;
}int main(){int nums = 10;while(nums --) {vector <int> arr1;vector <int> arr2;initVec(arr1);arr2 = arr1;heap_sort(arr1);sort(arr2.begin(), arr2.end());cout << "the heap_sort result: ";print(arr1);cout << "the correct result: ";print(arr2);for(int i = 0; i < arr1.size(); i ++) {if(arr1[i] != arr2[i]) {cout << "wrong result:" << endl;cout << arr1[i] << " and " << arr2[i] << endl;return 1;}}cout << "correct result!" << endl;}return 0;
}

View Code

转载于:https://www.cnblogs.com/chruny/p/6497361.html

堆排序实现(C++)相关推荐

  1. 排序算法 - 堆排序

    堆排序是指利用堆这种数据结构所设计的一种排序算法. 类型:选择排序 时间复杂度(最坏):O(nlogn) 时间复杂度(最好):O(nlogn) 时间复杂度(平均):O(nlogn) 空间复杂度:O(1 ...

  2. 白话经典算法系列之七 堆与堆排序

     堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满 ...

  3. MYSQL实现ORDER BY LIMIT的方法以及优先队列(堆排序)

    一.MYSQL中的LIMIT和ORACLE中的分页 在MYSQL官方文档中描述limit是在结果集中返回你需要的数据,它可以尽快的返回需要的行而不用管剩下的行, 在ORACLE中也有相关的语法比如 1 ...

  4. 插入排序,希尔排序,堆排序

    本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...

  5. (C++)堆排序的3个关键函数

    堆排序:指使用堆结构对一个序列进行排序.所以,首先要有一个堆结构. 此处讨论递增排序.以及用最大堆. 注意:让存放堆的数组作为全局变量,n为元素个数,数组存放元素从下标1开始,n结束. int hea ...

  6. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  7. 排序算法总结之堆排序

    一,堆排序介绍 堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将 待排序的数组 建堆,然后不断地删除堆顶元素,就实现了排序.关于堆,参考:数据结构--堆的实现之深入分析 下面的堆排序算法将数 ...

  8. Python最大堆排序实现方法

    Python最大堆排序实现方法,具体代码如下:   # -*- coding: utf-8 -*-   def merge_sort(seq, cmp=cmp, sentinel=None):     ...

  9. 【算法学习】堆排序建立最大堆

    本文代码均转自: 作者:早就戒了 来源:CSDN 原文:https://blog.csdn.net/qq_37169817/article/details/79777264 版权声明:本文为博主原创文 ...

  10. 建堆 java_堆排序就这么简单

    一.堆排序介绍 来源百度百科: 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完 ...

最新文章

  1. .Net SqlDbHelper
  2. css有些效果不显示,css导入成功但没有效果怎么办
  3. 在“3_人民日报语料”中统计“日语借词”的词频;
  4. HTTP基础及基本配置
  5. 温州大学《机器学习》课程课件和视频(四)朴素贝叶斯
  6. HTTP方法:幂等性和安全性
  7. 英语中的开音节和闭音节
  8. (转)Win7下如何硬盘安装Ubuntu
  9. Android 8.0学习(5)---模块化内核
  10. XDOC云服务API(二)
  11. SpringBoot入门 2
  12. 《How to debug PS4 game》
  13. EIGRP路由协议实现网络互联
  14. MAPX中的数据绑定问题
  15. WIN7Activation激活WIN7教程
  16. Thread.MemoryBarrier 方法
  17. 中兴网信员工坠楼事件背后:程序员中年危机来了?
  18. 机械键盘和普通键盘打字哪个舒服
  19. oracle之SQL的基本函数
  20. python用两分钟告诉你,怎样暴力破解隔壁老王的 WiFi 密码

热门文章

  1. 出现次数最多的整数-蓝桥杯算法训练
  2. Docker Image执行流程
  3. Windows下Tuxedo的安装与配置-无数据库
  4. 大陆集团:放弃内燃机,适用于高阶自动驾驶MK C1制动系统2020年国内投产
  5. nfs:server 172.168.1.22 not responding,still trying arm客户端配置
  6. 陈国良院士将出席“首届对象存储技术与应用大会”
  7. Cordova的安装及环境配置
  8. centos6.6-zabbix2.4.5安装实战
  9. python删除指定日期前的备份文件
  10. NFS+rsync+inotify镜像