排序算法中对堆排序的解析

58 篇文章 0 订阅

堆排序的算法是紧接希尔排序,它的原理就是把一个待排序的序列先创建成一个二叉树,这个二叉树具有的性质是:每一个节点都大于它的孩子节点,即为:大顶堆,反之即为小顶堆。

要实现这样的二叉树,我们从下往上,从左往右将每个非叶子节点作为根节点,将其和它的叶子节点作比较,实施交换,将最大的节点上升为非叶子节点。所以我们先要找到二叉树的根节点,这里可以用 n/2  来表示最后面非叶子节点的坐标。在这个循环操作之后,最大的节点上升为了整颗二叉树的根节点。也就是说在整个序列中第一个数就是最大的数,注意:最后一个数不一定是最小的数。

代码实现如下:

先创建一个结构体:

#define MAXSIZE 100
typedef struct{
    int r[MAXSIZE];
    int length;
}

在程序中我们是从下标为  1 来开始存储和遍历数的。

void createHeapSort(SqList *L){
    int i;
    for(i = L->length/2; i >0; i--){
        heapAdjust(L,i,L->length);
    }
}

这里我们从最后一个非叶子节点开始向上走,没走一次都将子树中最大的节点上升为非叶子节点

void heapAdjust(SqList *L, int s, int m){
    int j, temp;
    temp = L->r[s];
    for(j = 2*s; j <= m; j *= 2){
	if(j < m && L->r[j] < L->r[j+1]){
	    ++j;
	}
	if(temp >= L->r[j]){
	    break;
	}	
	L->r[s] = L->r[j];	
	s = j;
    }
    L->r[s] = temp;
}

这里的作用就是创建一个二叉树,将这个树中最大的节点上升为整棵树的根节点。
接下来就可以进行排序了:

void heapSort(SqList *L){
    int i;
    for(i = L->length; i > 1; i--){
	swap(L,i,1);
	heapAdjust(L,1,i-1);
    }
}

这里将堆顶元素和最后的一个元素做交换,这样一来整个序列中最开始的数即使整个序列最大的值。接着就可以将最大的数排除,重新创建一个树。以此循环。就可以不断地将最大的数升上来,这里有点像冒泡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值