排序算法之 Heap Sort
Heap Sort (cpp_heap_sort.cc)
================================================================================
最好时间复杂度 O(nlogn)
平均时间复杂度 O(nlogn)
最坏时间复杂度 O(nlogn)
空间复杂度 O(1)
是否稳定 否
Heap Sort利用的是二叉堆结构能在O(logn)时间内取出最大元素的特点,将所有元素构建成堆后依次取出完成排序。
经典的取出最大元素的算法是将最后一个元素放到根的位置然后向下调整,由于调整后的位置理论上还是接近堆底,所以这种方法的复杂度接近O(2logn),在测试中我使用了一个改进算法,首先向上调整填充空出的根位置,在堆底留出空位,再将最后一个元素放入空位向上调整。这个改进算法减少了复杂度因子,在很大程度上提高了算法效率。
Heap Sort是高级排序算法中能保证O(nlogn)时间界的和O(1)空间界的少数算法之一(还有两个是Inplace Merge Sort和堆排序的改进版Smooth Sort),在理论上是一个相当完美的算法。但由于堆排序所需比较次数较多,而且在比较、交换元素的时候也是大范围跳跃的,所以速度并不是很快。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <ctime> 4 5 static unsigned int set_times = 0; 6 static unsigned int cmp_times = 0; 7 8 template<typename item_type> void setval(item_type& item1, item_type& item2) { 9 set_times += 1;10 item1 = item2;11 return;12 }13 14 template<typename item_type> int compare(item_type& item1, item_type& item2) {15 cmp_times += 1;16 return item1 < item2;17 }18 19 template<typename item_type> void swap(item_type& item1, item_type& item2) {20 item_type item3;21 22 setval(item3, item1);23 setval(item1, item2);24 setval(item2, item3);25 return;26 }27 28 template<typename item_type> void heap_sort(item_type* array, int size) {29 item_type tempitem;30 int current;31 int next;32 int top = size / 2;33 34 while(size > 0) {35 if(top > 0) top -= 1; else swap(array[--size], array[0]);36 37 setval(tempitem, array[top]);38 current = top;39 while(1) {40 next = current * 2 + 1;41 if(next + 1 < size && compare(array[next], array[next + 1])) {42 next += 1;43 }44 if(next < size) {45 setval(array[current], array[next]);46 current = next;47 } else break;48 }49 50 while(next > 0) {51 next = (current - 1) / 2;52 if(next >= top && compare(array[next], tempitem)) {53 setval(array[current], array[next]);54 current = next;55 } else break;56 }57 setval(array[current], tempitem);58 }59 return;60 }61 62 int main(int argc, char** argv) {63 int capacity = 0;64 int size = 0;65 int i;66 clock_t clock1;67 clock_t clock2;68 double data;69 double* array = NULL;70 71 // generate randomized test case72 while(scanf("%lf", &data) == 1) {73 if(size == capacity) {74 capacity = (size + 1) * 2;75 array = (double*)realloc(array, capacity * sizeof(double));76 }77 array[size++] = data;78 }79 80 // sort81 clock1 = clock();82 heap_sort(array, size);83 clock2 = clock();84 85 // output test result86 fprintf(stderr, "heap_sort:\t");87 fprintf(stderr, "time %.2lf\t", (double)(clock2 - clock1) / CLOCKS_PER_SEC);88 fprintf(stderr, "cmp_per_elem %.2lf\t", (double)cmp_times / size);89 fprintf(stderr, "set_per_elem %.2lf\n", (double)set_times / size);90 for(i = 0; i < size; i++) {91 fprintf(stdout, "%lf\n", array[i]);92 }93 free(array);94 return 0;95 }
转载于:https://www.cnblogs.com/richselian/archive/2011/09/16/2179146.html
排序算法之 Heap Sort相关推荐
- 经典排序算法 - 堆排序Heap sort
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...
- 经典排序算法 - 冒泡排序Bubble sort
经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...
- 排序算法——冒泡排序(Bubble Sort)
排序算法--冒泡排序(Bubble Sort) 算法简介(Introduction) Bubble sort is to compare adjacent elements of the list a ...
- php+堆排序算法,PHP实现排序堆排序(Heap Sort)算法
算法引进: 在这里我直接引用<大话数据结构>里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据 ...
- 排序算法之 Shell Sort
Shell Sort (cpp_shell_sort.cc) ===================================================================== ...
- 基础排序算法 – 冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束. 从小到大排序: 原 ...
- [经典排序算法][集锦]
经典排序算法 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处 这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教 大多数排序算法都给出了每一步的状态,以方便初学者 ...
- C++Heap Sort堆排序的实现算法(附完整源码)
C++Heap Sort堆排序的实现算法 C++Heap Sort堆排序的实现算法完整源码(定义,实现,main函数测试) C++Heap Sort堆排序的实现算法完整源码(定义,实现,main函数测 ...
最新文章
- Udacity机器人软件工程师课程笔记(三十五) - SLAM - 基于网格的FastSLAM
- 嵌入式Linux入门经典笔记
- Atitit.数据操作dsl 的设计 ---linq 方案
- linux 网络编程学习
- [LOJ]体育成绩统计 / Score (无脑模拟,没有脑子,就是上!)
- 深入Java集合系列之五:PriorityQueue
- 一个简单的 Generic Factory 类
- 用STATSVN统计公司SVN代码修改
- Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
- 吴恩达机器学习编程题ex1上 单变量线性回归: (python版含题目要求、代码、注解)
- Fiddler 介绍二
- ZTree async中文乱码,ZTree reAsyncChildNodes中文乱码,zTree中文乱码
- IDEA 使用mybatis插件Free Mybatis plugin
- win7高级搜索计算机,使用win7系统高级搜索功能的方法介绍
- V4L2视频采集的基本流程
- 网站域名服务器怎么备案,网站域名服务器怎么备案
- R语言绘制沈阳地铁线路图
- Linux常用命令一览表
- Docker系列 搭建个人云盘服务nextcloud
- H3 BPM 端到端流程解决方案 (附H3 BPM软件下载地址)