堆排序总结

堆排序

原理

基本思想:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个子序列重新构造成一个堆,这样就会得到 n 个元素中的次大值。如此反复执行,就能得到一个有序序列。

可用动图描述为:
在这里插入图片描述

**

性能

**

时间复杂度空间复杂度稳定性
O(nlogn)O(1)非稳定性排序

大顶堆C++代码如下:

#include<iostream>
using namespace std;

//交换函数
void swap(int arr[], int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
 } 	
 
 void HeapAdjust(int arr[], int i, int length)
 {
//调整i位置的结点
//先保存当前结点的下标
 	int max = i;
//当前结点左右孩子结点的下标
 	int parent;
 	int lchild = 2 * i + 1;
 	int rchild = 2 * i + 2;
 	if (lchild < length && arr[lchild] > arr[max])
 	{
 		max = lchild;
	 }
	 if (rchild < length && arr[rchild] > arr[max])
	 {
	 	max = rchild;
	 }
//若i处的值比其它左右孩子结点的值小,就将其和最大值进行交换
	 if (max != i)
	 {
	 	swap(arr, i, max);
 //递归
	 	HeapAdjust(arr, max, length);
	 }
 }
 //堆排序
 void HeapSort(int arr[], int length)
 {
 //初始化堆
 //length / 2 - 1是二叉树中最后一个非叶子结点的序号
 //把数组构成一个大顶堆
 	for (int i = length / 2 - 1; i >= 0; i--)
	 {
	 	HeapAdjust(arr, i, length);
	  } 
	 for (int i = length - 1; i >= 0; i--)
	 {
 //将堆顶记录和当前未经排序子序列的最后一个记录交换
	 	swap(arr, 0, i);
 //重新调整为大顶堆
	 	HeapAdjust(arr, 0, i );
	  } 
 }
 
 int main ()
 {
 	int arr[] = {9,8,6,7,5,3,4,1,2,0};
 	int length = sizeof(arr) / sizeof(arr[0]);
 	HeapSort(arr, length);
 	for (int i = 0; i < length; i++)
 	{
 		cout << arr[i] << " ";
	 }
	 return 0;
 }

大顶堆测试结果:
在这里插入图片描述

小顶堆代码如下:

#include<iostream>
using namespace std;

void swap(int arr[], int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

void HeapAdjust(int arr[], int i, int length)
{
	int min = i;
	int lchild = 2 * i + 1;
	int rchild = 2 * i + 2;
	if (lchild < length && arr[lchild] < arr[min])
	{
		min = lchild;
	}
	if (rchild < length && arr[rchild]  < arr[min])
	{
		min = rchild;
	}
	if (min != i)
	{
		swap(arr, min, i);
		HeapAdjust(arr, min, length);
	}
}

void HeapSort(int arr[], int length)
{
	for (int i = length / 2 - 1; i >= 0; i--)
	{
		HeapAdjust(arr, i, length);
	}
	for (int i = length - 1; i >= 0; i--)
	{
		swap(arr, 0, i);
		HeapAdjust(arr, 0, i );
	 } 
}

int main ()
 {
// 	int arr[] = {4, 1, 2, 3, 6, 7, 5, 9, 8};
	int arr[]  = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
 	int length = sizeof(arr) / sizeof(arr[0]);
 	HeapSort(arr, length);
 	for (int i = 0; i < length; i++)
 	{
 		cout << arr[i] << " ";
	 }
	 return 0;
 }

小顶堆测试结果如下:

在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值