经典排序之 堆排序
2016-03-25 16:56
281 查看
下面来说一下堆排序,这个有点复杂;
堆是一种数据结构,可以把它看成一棵完全二叉树,这棵完全二叉树满足任何一个非叶子节点的值都不大于或不小于其左右孩子节点的值,分别叫做大顶堆和小顶堆。
算法思想:
堆排序的算法分为两步:建立堆和排序;
1)建堆:
将序列调整为大顶堆,每一次都是父节点和子节点进行比较然后进行调整;
2)排序:
在已经建好的大顶堆的前提下,将根节点的元素和后边的元素交换,再调整直到最后;
这样堆排序每次都会有一个元素位于其最终的位置。堆排序适合数据量很大的情况下,典型的例子是在1000000个数据中选出最小的前10个。堆排序的最好,最坏,和平均的时间复杂度均是O(n*lgn)。它是一种不稳定的排序。
算法实现:
下边 的图示过程:
堆是一种数据结构,可以把它看成一棵完全二叉树,这棵完全二叉树满足任何一个非叶子节点的值都不大于或不小于其左右孩子节点的值,分别叫做大顶堆和小顶堆。
算法思想:
堆排序的算法分为两步:建立堆和排序;
1)建堆:
将序列调整为大顶堆,每一次都是父节点和子节点进行比较然后进行调整;
2)排序:
在已经建好的大顶堆的前提下,将根节点的元素和后边的元素交换,再调整直到最后;
这样堆排序每次都会有一个元素位于其最终的位置。堆排序适合数据量很大的情况下,典型的例子是在1000000个数据中选出最小的前10个。堆排序的最好,最坏,和平均的时间复杂度均是O(n*lgn)。它是一种不稳定的排序。
算法实现:
#include<iostream> using namespace std; void swap(int &a, int &b){ int temp = a; a = b; b = temp; } void adjustShift(int *data, int low, int high){ //建堆 int i = low, j = 2 * i + 1; //数据从下标0开始 int temp = data[i]; while(j <= high){ //若右孩子大,则调整 if(j < high && data[j] < data[j + 1]){ ++j; } if(temp < data[j]){ data[i] = data[j]; i = j; j = 2 * i + 1; } else{ break; } } data[i] = temp; } void headSort(int *data, int length){ //排序 int i, temp; for(i = length / 2 ; i >= 0; --i){ //建立初始堆 adjustShift(data, i, length ); } for(i = length; i >= 1; i--){ //进行n-1次循环,完成排序 swap(data[0], data[i]); adjustShift(data, 0, i - 1); } } int main(){ //测试程序 int str[] = {23, 34, 2, 0, 56, 89, 5, 8, 13}; int len = sizeof(str) / sizeof(int); headSort(str, len - 1); for(int k = 0; k < len; k++){ cout<<str[k]<<' '; } return 0; }
下边 的图示过程:
相关文章推荐
- 练习一1008
- 礼拜五log~js函数setTimeout
- 责任链模式
- NYOJ 题目6 喷水装置(一) 水贪心
- .Net 发邮件
- Drupal7 自定义模块之.info文件
- C#数组冒泡排序
- 【LeetCode】299. Bulls and Cows
- 不同网段实现打印机共享
- date,datetime,timestamp 的区别
- Maven .m2 setting.xml配置
- Sass 基础(六)
- C# 文件压缩与解压(ZIP)基于 .Net Framework
- SVN强制添加注释
- 走进网络直播公司 揭开“网络主播”神秘面纱
- nmap#1基本原理
- 数据库事务ACID
- 五种创建UIImage的类方法
- 基本文件读写及简单停用词处理
- 关于easyUI的combbobox下拉框多选时,后台获取下拉框的值获取的问题