堆排序及调整算法

调整算法

向上调整:

对大堆向上调整:

 adujust_up

void adjust_up(int* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			swap(a[child], a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else//默认是大堆
		{
			break;
		}
	}
}

向下调整:

有一个前提,那就是左右子树都是小堆。

adjust_down

void adjust_down(int* a, int n,int root)
{
	int parent = root;
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1<n&&a[child + 1] > a[child])//在不是满二叉树的情况下,可能出现只有左孩子没有右孩子
		{
			child++;
		}
		if (a[parent] < a[child])
		{
			swap(a[parent], a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else//已经是小堆的情况下,如果左右孩子中小的那个比父亲大,则跳出循环
		{
			break;
		}
	}
}

堆排序

堆排序的核心思想是建堆。

排升序建大堆。

以免树的关系发生混乱。

void heap_sort(int* a, int n)
{
	for (int i = (n - 1 - 1) / 2; i >= 0; --i)
	{
		adjust_down(a, n, i);
	}
	int end = n - 1;
	while (end > 0)
	{
		swap(a[0], a[end]);
		adjust_down(a, end, 0);
		--end;
	}
}

相关推荐

  1. 排序算法-排序

    2024-04-10 04:50:03       38 阅读
  2. [排序算法]排序

    2024-04-10 04:50:03       118 阅读
  3. 算法排序

    2024-04-10 04:50:03       40 阅读

最近更新

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

    2024-04-10 04:50:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 04:50:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 04:50:03       82 阅读
  4. Python语言-面向对象

    2024-04-10 04:50:03       91 阅读

热门阅读

  1. C语言编译过程

    2024-04-10 04:50:03       32 阅读
  2. [C++/Linux] UDP编程

    2024-04-10 04:50:03       35 阅读
  3. 【LeetCode热题100】【二叉树】二叉树的层序遍历

    2024-04-10 04:50:03       42 阅读
  4. 经典面试排序题(快排堆排)

    2024-04-10 04:50:03       34 阅读
  5. SVN(Subversion)代码版本管理

    2024-04-10 04:50:03       34 阅读
  6. linux查看用户登录情况

    2024-04-10 04:50:03       30 阅读
  7. python | ttkbootstrap,一个神奇的 Python 库!

    2024-04-10 04:50:03       34 阅读
  8. Macbook M1版安装安卓模拟器

    2024-04-10 04:50:03       34 阅读