堆排序 一个综合了插入排序和二路归并特点的排序算法(未测试)
来源:互联网 发布:绝地求生辅助网站源码 编辑:程序博客网 时间:2024/05/22 02:23
/*1.学习怎么使用 堆排序 1.1堆排序让我觉得最重要的是维护堆性质的这部分 效率是lgn 在我脑海中的维护堆性质的图任然是很清晰, 因为它的重要性贯彻了整个排序 1.2其次就是创建最大堆, 创建最大堆是将数组中的数据以最大堆的性质展现出来,然后可以拿到最大值,创建最大堆的效率准确 的上届是n 1.3这个就是讲数组通过最大堆的形式表现出来 综合如上方法 形成堆排序 */
void maxHeap(int a[],int i ){ int theMax =i;//这是为了记住最大值的下标 便于往下维护 //父节点为i 的话,那么孩子节点就应该为 2i与2*i+1 //堆是建立完全二叉树 if(2*i > strlen(a)){ //如果是叶子节点的话 我直接跳出来 return ; } //判断哪个值更大 if((2*1+1)<strlen(a) && a[2*i+1]>a[i] && a[2*i+1] >a[2*i] ){ theMax = 2*i+1; }else if(a[2*i] > a[i]){ theMax = 2* i ; } if(i < theMax){ a[i]=a[i]^a[theMax]; //这是按位异或做的值的交换 a[theMax] = a[i]^a[theMax]; a[i] = a[i]^a[theMax]; maxHeap(a,theMax); }}
/*
这是维护堆性质的方法
通过我脑子的图像 维护主要是父节点和孩子节点的比较过程
如果不孩子大的话就不需要维护了
如果比孩子小的话 和孩子交换值,并往下维护
输入 是一个待排序的数组 和需要维护的节点
*/
/*
创建最大堆在我的脑海中图是先从最后一个父节点开始,来维护堆性质,直到维护到第一个节点才成为了最大的堆
输入: 是是一个待创建成最大堆的数组, first是起始(一般为0 ),end是结束
*/
void createMaxHeap(int a[],int first ,int end ){ int startParent = end/2; //这是第一个父亲节点的下标 while(startParent>=first){ maxHeap(a,startParent);//去维护堆 直到为first startParent--; }}
/*
真正的堆排序 ,在我脑海中的图像是 首先是一个最大堆,然后抽取最大值下来,注意是第一个与最后一个交换
便于维护。
然后是缩短最大堆的大小,重复这个动作,直到为 1
循环不变式就是上面的
*/
void heapSort(a[]){ createMaxHeap(a,0,strlen(a)); //首先就是创建最大堆 int heapSize = strlen(a); //最大堆的大小 a[heapSize-1] = a[0]; //交换值 heapSize--; while(heapSize>1){ //当堆的值小到只有一个的时候 那肯定是最小的值了
maxHeap(a,0); //维护堆
a[heapSize-1]=a[0]; heapSize--;
}
}
- 堆排序 一个综合了插入排序和二路归并特点的排序算法(未测试)
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 排序算法(直接插入,堆排,归并排序)
- 排序----插入排序,二路归并排序,堆排序,快速排序
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 排序算法(二):快速,归并,堆排序
- 排序算法(堆排序、插入排序、归并排序、快速排序)
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序(插入,堆排序,归并)
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 网站性能指南
- Java中字符串比较的注意点
- Corosync+Pacemaker实现简单的Web HA集群
- 高效算法设计专项:LA 2963
- MFC下MD5加密算法实现,带key(32位MD5小写)
- 堆排序 一个综合了插入排序和二路归并特点的排序算法(未测试)
- LoadRunner结果分析 – TPS
- Object-C 实现判断一个字符串是否是数字
- 动态规划专项intermediate:UVa 11400
- LoadRunner压力测试结果分析探讨
- 性能问题定位及调优
- 杂题专项:UVa 818
- poj 3270 置换群
- 《c和指针》笔记-简洁的二叉查找树删除node方法