博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序实现代码
阅读量:2384 次
发布时间:2019-05-10

本文共 977 字,大约阅读时间需要 3 分钟。

void heapSort(int array[], int n)

{ int i; for (i=n/2;i>0;i--)

{

HeapAdjust(array,i,n);

}

for( i=n;i>1;i--) {

swap(array, 1, i);

HeapAdjust(array, 1, i-1);

}

}

void HeapAdjust

(int array[], int s, int n )

{

int i,temp;

temp = array[s];

for(i=2*s;i<=n;i*=2)

{

if(i<n&&array[i]<array[i+1])

{

i++;

}

if(temp>=array[i])

{

break;

}

array[s]=array[i];

s=i;

}

array[s]=temp;

} void swap

(int array[], int i, int j)

{ int temp;

temp=array[i];

array[i]=array[j];

array[j]=temp; }

原文:https://blog.csdn.net/yushiyi6453/article/details/76407640

for循环中只会调整某一结点跟他的左右子节点的顺序,以及由于该节点跟左右子节点的移动,导致以该左右子节点为根节点的子树大小发生变化,要一并进行调整。

那么每一层中的其他节点的调整是由HeapAdjust(array, 1, i-1);这个for循环进行判断的。

heapsort中的for循环只管某一个节点跟它的左右子节点的交换,以及该交换带来的效应,继续进行交换。

第一个判断条件:i<n是想判断下该节点有左节点,是否还有右节点。

第二个判断条件:通过第一个判断条件,此时i指向的是最大的那个节点,因为如果有有节点,且有节点较大,那么i++就代表有节点,如果没有或者左节点较大,那么i就为左节点,而如果temp比这个节点值要大,那么直接break

退出整个循环即可。通过另外的HeapAdjust(array, 1, i-1);循环去判断其他的节点跟他的左右子节点以及调整带来的效应。

第二遍的for循环通过s=i;

去判断该节点的下一个节点是否需要调整,如果需要就继续运行for循环。

你可能感兴趣的文章
A Proposal on Organization of Information System
查看>>
冒号和他的学生们(连载2)——首轮提问
查看>>
正则表达式与文件格式化处理
查看>>
Java EE互联网轻量级框架整合开发
查看>>
Java语言程序设计(基础篇)
查看>>
大型网站技术架构:核心原理与案例分析
查看>>
JAVA并发编程实战
查看>>
RabbitMQ实战++高效部署分布式消息队列
查看>>
微服务设计
查看>>
Spring Cloud微服务实战
查看>>
C++ static 语义
查看>>
C++ static 语义
查看>>
Linux Cgroups概述
查看>>
centos7 硬盘性能测试
查看>>
cgroup使用--cpu资源限制
查看>>
cgroup使用--memory资源限制
查看>>
Redis 单机环境搭建
查看>>
elasticsearch 单机环境搭建
查看>>
spark 独立模式部署
查看>>
Redis 基础命令 --- String篇
查看>>