15. 蛤蟆的数据结构进阶十五排序实现之堆排序

15. 蛤蟆的数据结构进阶十五排序实现之堆排序

本篇名言:“谁要是游戏人生 ,他就一事无成 ;
谁不能主宰自己 ,永远是一个奴隶。--歌德”

继续来看下堆排序。

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47733553

1.  堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]]
>= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

(a)大顶堆序列:(96,83,27,38,11,09)

(b)  小顶堆序列:(12,36,24,85,47,30,53,91)

如图建堆初始过程:无序序列:(49,38,65,97,76,13,27,49)

2.  代码实现

从一个无序序列建堆的过程就是一个反复筛选的过程。若将此序列看成是一个完全二叉树,则最后一个非终端节点是第[n/2]个元素,由此筛选只需从第[n/2]个元素开始。

代码核心是先将数组假想为完全二叉树。那么偶数位的数是左孩子,奇数位的数是右孩子。

先将数组进行完全二叉树处理,然后将根节点提取出来放到数组最后,将原先数组的最后一个元素放到根节点,因为不能保证原先数组最后一个的元素是剩下元素中最大的,所以要紧接着做一次处理(此次处理将最后一个元素除外)。接下去是继续去根节点放到数组倒数第二个位置,以此循环。

实现如下图1

3.  源码

#include"stdio.h"

void print(inta[],intn){

for(intj= 0; j<n; j++){

printf("%d",a[j]);

}

}

/**

*已知H[s…m]除了H[s]外均满足堆的定义

*调整H[s],使其成为大顶堆即将对第s个结点为根的子树筛选,

*

* @param H是待调整的堆数组

* @param s是待调整的数组元素的位置

* @param length是数组的长度

*

*/

void HeapAdjust(intH[],ints,
int
length)

{

inttmp  = H[s];

intchild = 2*s+1;
//左孩子结点的位置。(i+1为当前调整结点的右孩子结点的位置)

while(child < length) {

if(child+1<length &&
H[child]<H[child+1]){
// 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)

++child;

}

if(H[s]<H[child]){ //
如果较大的子结点大于父结点

H[s]=
H[child]; // 那么把较大的子结点往上移动,替换它的父结点

s =child;       // 重新设置s ,即待调整的下一个结点的位置

child= 2*s+1;


else {            // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出

break;

}

H[s]= tmp;        
// 当前待调整的结点放到比其大的孩子结点位置上

}

//       print(H,length);

}

/**

*初始堆进行调整

*将H[length-1]建成堆

*调整完之后第一个元素是序列的最小的元素

*/

void BuildingHeap(intH[],intlength)

{

//最后一个有孩子的节点的位置 i=  (length -1) / 2

for (int i= (length -1) / 2 ; i >= 0; --i)

HeapAdjust(H,i,length);

}

/**

*堆排序算法

*/

void HeapSort(intH[],intlength)

{

//初始堆

BuildingHeap(H,length);

//从最后一个元素开始对序列进行调整

for (int i=
length - 1; i > 0; --i)

{

//交换堆顶元素H[0]和堆中最后一个元素

inttemp = H[i];
H[i]= H[0];
H[0]= temp;

//每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整

HeapAdjust(H,0,i);

}

}

int main(){

intH[10] = {3,1,5,7,2,4,9,6,10,8};

printf("初始值:\n");

print(H,10);

HeapSort(H,10);

//selectSort(a,8);

printf("\n堆排序后值:\n");

print(H,10);

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 16:00:15

15. 蛤蟆的数据结构进阶十五排序实现之堆排序的相关文章

16. 蛤蟆的数据结构进阶十六排序实现之基数排序

16. 蛤蟆的数据结构进阶十六排序实现之基数排序 本篇名言:"社会犹如一条船 ,每人都要有掌舵的准备.--易卜生" 我们来看下基数排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47760601 1.  基数排序 基数排序(radix sort)属于"分配式排序"(distributionsort),又称"桶子法"(bucket sort)或bin sort,顾名思义,

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序 本篇名言:"即是我们是一支蜡烛也应该 " 蜡烛成灰泪始干 " 即使我们只是一根火柴也要在关键时刻有一次闪耀即使我们死后尸骨都腐烂了解也要变成磷火在荒野中燃烧. -- 艾青" 继续来看什么是简单选择排序. 欢迎转载,转载请标明出处: 1.  简单选择排序 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟后就完

18. 蛤蟆的数据结构进阶十八排序实现之快速排序

18. 蛤蟆的数据结构进阶十八排序实现之快速排序 本篇名言:"一个人做点好事并不难,难的是一辈子做好事,不做坏事.--毛泽东" 我们最后来看下快速排序,以及各个排序之间的一些信息汇总. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47817933 1.  快速排序 快速排序由C. A. R.Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分

12. 蛤蟆的数据结构进阶十二排序实现之直接插入法

12. 蛤蟆的数据结构进阶十二排序实现之直接插入法 本篇名言:"路是脚踏出来的 ,历史是人写出来的,人的每一步行动都在书定自己的历史. --吉鸿昌" 接下来看下直接插入法的实现. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47687631 1.  直接插入法 直接插入排序(straightinsertion sort) 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 第一趟比较前两

19. 蛤蟆的数据结构进阶十九外部排序相关概念

19. 蛤蟆的数据结构进阶十九外部排序相关概念 本篇名言:"一个人最怕不老实,青年人最可贵的是老实作风. "老实 " 就是不自欺欺人,做到不欺骗人家容易,不欺骗自己最难. "老实作风 " 就是脚踏实地,不占便宜.世界上没有便宜的事,谁想占便宜水就会吃亏. --徐特立" 之前我们学习的排序都是内部排序的,接下去来看下外部排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47

10. 蛤蟆的数据结构进阶十排序相关概念

10. 蛤蟆的数据结构进阶十排序相关概念 本篇名言:"生,亦我所欲也:义,亦我所欲也:二者不可得兼,舍生而取义者也.--孟轲" 接下去我们将来看下排序相关的知识. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47381339 1.  排序 排序是什么? 将一组杂乱无章的记录按一定规律顺序排列起来. 什么排序方法是稳定的?什么是不稳定的? 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记

6. 蛤蟆的数据结构进阶六之二叉树排序树

6. 蛤蟆的数据结构进阶六之二叉树排序树 本篇名言:"有些人因为贪婪,想得更多的东西,却把现在所有的也失掉了. -- 伊索" 关于理论知识已经在上篇中进行描述,这篇我们主要来看下如何是实现二叉排序树. 欢迎转载,转载请标明出处: 1.  二叉排序树的定义 二叉排序树(BinarySort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值: ②

17. 蛤蟆的数据结构进阶十七排序实现之归并排序

17. 蛤蟆的数据结构进阶十七排序实现之归并排序 本篇名言:"人生不是一种享乐 ,而是一桩十分沉重的工作.-- 列夫 . 托尔斯泰" 我们来看下归并排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47790163 1.  归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个

5. 蛤蟆的数据结构进阶五动态查询

5. 蛤蟆的数据结构进阶五动态查询 本篇名言:"判断一个人,不是根据他自己的表白或对自己的看法,而是根据他的行动. --列宁" OK,我们接下去来看下动态查询. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47284473 1.  动态查找表 动态查找表:若在查找过程中可以将查找表中不存在的数据元素插入,或者从查找表中删除某个数据元素,则称这类查找表为动态查找表.动态查找表在查找过程中查找表可能会发生变化.对动态