排序之堆排序

本文详细介绍了堆排序算法的基本原理和实现过程。堆排序是一种基于完全二叉树的数据结构来进行排序的方法,通过不断调整不符合堆定义的完全二叉树,使之成为符合堆定义的完全二叉树,从而实现排序。堆排序的时间复杂度为O(N*logN),空间复杂度为O(1),是一种高效的排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序

利用这种数据结构进行排序的一种算法,它是选择排序的一种。

我们可以把堆看成一棵完全二叉树,这棵完全二叉树满足:

  • 任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。
  • 若父亲大孩子小,则这样的堆叫做大堆;
  • 若父亲小孩子大,则这样的堆叫作小堆。

大堆:每个节点的值大于等于孩子节点的堆)
在这里插入图片描述
小堆:每个节点的值小于等于孩子节点的堆
在这里插入图片描述

基本思想

代表堆的完全二叉树的根结点的值是最值的,也是数组的第一个元素,将一个无序序列调整为一个堆,就可以找出这个序列的最值,然后将找出的这个最大值交换到序列的最后(或最前),这样有序序列关键字增加1个,无序序列关键字减少1个,对新的无序序列重复这样的操作,就实现了排序。

注意:

堆排序中最关键的操作是将序列调整为堆,整个排序的过程就是通过不断调整,使得不符合堆定义的完全二叉树变为符合堆定义的完全二叉树。

堆的存储结构:

逻辑结构:
在这里插入图片描述

内存结构:
在这里插入图片描述
代码实现:

//堆化
void heapify(int a[], int size, int index){
	int left = index * 2 + 1;
	int right = index * 2 + 2;
	int max;
	if (left > size||right>size){
		return;
	}
	max = a[left] >= a[right] ? left : right;
	if (a[index] >= a[max]){
		return;
	}
	else{
		swap(a[index], a[max]);
		heapify(a, size, max);
	}
}
//建堆
int creatHeap(int a[],int size){
    for(int i=size/2-1;i>=0;i--){ //从最后一个叶节点的双亲节点开始堆化
    heapify(a,size,i);
    }
}    
    
void HeapSort(int a[], int size){
	creatHeap(a, size);
	for (int i = size-1; i >= 0; i--){
		swap(a[0], a[i]);
		heapify(a, i - 1, 0);
	}
}

堆排序的特性总结:

  1. 堆排序使用堆来选数,效率就高了很多
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值