【C/C++ 03】堆排序

堆排序是选择排序算法的进阶,也就是通过二叉树节点存储数组,并通过root节点存储最值与二叉树最后一个节点进行交换完成排序,降低了时间复杂度。在大数据时代,堆排序常用于处理Top-K问题。

  • 排序对象:数组
  • 时间复杂度:O(n*\log n)
  • 空间复杂度:O(1)
  • 是否稳定:否

堆排序分为大根堆和小根堆,大根堆的root节点是最大值,小根堆的root节点是最小值,通常再进行升序排序的时候会建立大根堆,再进行降序排序的时候会建立小根堆。

在实际应用中,堆排序常用于解决Top-K问题。

void Swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

// 建大根堆,向下调整
void DownAdjust(int* arr, int parent, int n)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1 < n && arr[child] < arr[child + 1])
			child++;
		if (arr[parent] < arr[child])
		{
			Swap(&arr[parent], &arr[child]);
			parent = child;
			child = child * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSort(int* arr, int n)
{
	int parent = (n - 2) / 2;	// 最后一个节点的父节点
	while (parent >= 0)
	{
		DownAdjust(arr, parent, n);
		--parent;
	}
	while (--n)
	{
		Swap(&arr[0], &arr[n]);
		DownAdjust(arr, 0, n);
	}
}

大根堆构建过程:

// 示例数组
int arr[20] = {
    9, 3, 5, 7, 9, 0, 2, 4, 6, 8,
	5, 5, 5, 0, 0, 1, 3, 5, 8, 6
};
1. 将数组按下标转为二叉树结构
2. 从最后一个叶子节点的父节点作为根结点进行检查,将子树的最值放入对应的根节点
3. 继续向上检查每一棵子树,保证每棵子树的根节点都是最值
4. 大根堆构建完毕,所有子树的根节点都是最大值

相关推荐

  1. 排序!!

    2024-02-02 07:30:02       28 阅读
  2. 排序排序

    2024-02-02 07:30:02       58 阅读
  3. 排序算法-排序

    2024-02-02 07:30:02       38 阅读
  4. [排序算法]排序

    2024-02-02 07:30:02       118 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 07:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 07:30:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 07:30:02       82 阅读
  4. Python语言-面向对象

    2024-02-02 07:30:02       91 阅读

热门阅读

  1. Camille-学习笔记-SQL语法与数据库

    2024-02-02 07:30:02       41 阅读
  2. sqlite不会自动缩减问题

    2024-02-02 07:30:02       49 阅读
  3. 服务器渲染(SSR)-前端框架

    2024-02-02 07:30:02       42 阅读
  4. 前端框架和组件库的区别与联系

    2024-02-02 07:30:02       49 阅读
  5. 【Leetcode热题100】

    2024-02-02 07:30:02       54 阅读
  6. 工作中的小记录

    2024-02-02 07:30:02       57 阅读
  7. 力扣(leetCode)shell 193.有效电话号码

    2024-02-02 07:30:02       45 阅读
  8. [经典面试题]169. 多数元素

    2024-02-02 07:30:02       52 阅读
  9. golang网络编程day5

    2024-02-02 07:30:02       38 阅读
  10. I2S、I2C、SPI和UART的区别

    2024-02-02 07:30:02       51 阅读