IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 堆排序 -> 正文阅读

[数据结构与算法]堆排序

堆排序说是堆 其实还是用树来进行考究分析

对于父结点 子结点的规律可以自己试一下

父结点中的值大于两个子结点中的值 才可构成所谓完整的堆

假设一个结点坐标为i

那么这个结点的父结点坐标为 (i-1)/2? 两个子结点的坐标分别为 2*i+1 2*i+1

本次实现三个主要的函数 后面分析

首先写出主函数

#include<stdio.h>
int main()
{
	int tree[] = { 4,10,3,5,1,2 };
	int n = sizeof(tree) / sizeof(tree[0]);
	heaplify(tree, n, 0);//tree代表对这棵树 n表示这棵树有n个元素 0表示从下标0开始heaplify
	build_heap(tree, n);
	heap_sort(tree, n);
	return 0;
}

1.实现heaplify函数 作用:把父结点中的值都调节为大于对应子结点的值?

代码如下

void heaplify(int tree[], int n, int i)
{
	if (i >= n) 
	{
		return ;//超出边界 什么都不返回
	}
	int c1 = 2 * i + 1;
	int c2 = 2 * i + 2;//两个子结点的坐标
	int max = tree[i];//先顺应规则要求 令最大值为顶点
	//判断是否顶点为max
	if (c1<n && tree[c1]>max)
	{
		max = tree[c1];
	}
	if (c2<n && tree[c2]>max)
	{
		max = tree[c2];
	}
	//倘若最大值max变化了 则须换位
	if (max != tree[i])
	{
		int temp = max;
		max = tree[i];
		tree[i] = temp;
		//递归 因为max调换到下位时不一定大于它下面两个子结点的值 因此须递归max
		heaplify(tree, n , max);
	}
}

2.实现build_heap函数 作用:从最后一个顶点依次往上找相对顶点排序 保证父结点大于两个子结点

代码如下

void build_heap(int tree[], int n)
{
	int last = n - 1;//最后一个结点的下标为元素数减一
	//最后一个相对的父结点
	int fuLast = (n - 1) / 2;
	int i = 0;
	for (i = fuLast; i >= 0; i--)
	{
		heaplify(tree, n,i);
	}
}

3.heap_sort函数 作用:通过heaplify函数排序之后把每一个结点拽下来 排一下横序

用俗话就是砍下来 按顺序排好

void swap(int tree[], int i, int n)
{
	int temp = tree[i];
	tree[i] = tree[n];
	tree[n] = temp;
}
void heap_sort(int tree[], int n)
{
	//首先创建一个完整的堆
	build_heap(tree, n);
	int i = 0;
	for (i = n - 1; i >= 0; i--)
	{
		swap(tree, i, 0);//完整的堆最上面的根结点一定最大 把它换下去砍了 每次换最大的 砍去最大的 自己想一想
		heaplify(tree, i, 0);//每次砍一刀 掉一个结点 随着i变化
	}
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:31:37  更:2021-10-09 16:32:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 10:47:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码