温故知新,基础复习(二叉堆排序)

简介: 温故知新,基础复习(二叉堆排序)最小堆(最终数组的数据是降序),最大堆(最终数组的数据是升序)下例是最小堆#include #include void Swap(int Arra[],unsigned int LeftIndex,u...

温故知新,基础复习(二叉堆排序)

最小堆(最终数组的数据是降序),最大堆(最终数组的数据是升序)


下例是最小堆


#include <stdio.h>
#include <stdlib.h>

void Swap(int Arra[],unsigned int LeftIndex,unsigned int RightIndex)
{
	int TeampValue = Arra[LeftIndex];
	Arra[LeftIndex]=Arra[RightIndex];
	Arra[RightIndex]=TeampValue;
}

void MinHeapFixDown(int Arra[],unsigned int StartIndex,unsigned int ArraSize)
{
	int TeampValue = Arra[StartIndex];
	unsigned int MinValueIndexOfChild = 2*StartIndex+1;

	while(MinValueIndexOfChild<ArraSize)
	{
		//printf("%u,%d,%d,%d\n",StartIndex,TeampValue,MinValueIndexOfChild,ArraSize);
		if (MinValueIndexOfChild+1<ArraSize&&Arra[MinValueIndexOfChild]>Arra[MinValueIndexOfChild+1])
		{
			MinValueIndexOfChild=MinValueIndexOfChild+1;
		}

		if (Arra[MinValueIndexOfChild]>=TeampValue)
		{
			break;
		}

		Arra[StartIndex]=Arra[MinValueIndexOfChild];
		StartIndex=MinValueIndexOfChild;
		MinValueIndexOfChild=2*StartIndex+1;
	}

	Arra[StartIndex]=TeampValue;
}

void BuildMinHeap(int Arra[],unsigned int ArraSize)
{
	if (ArraSize<2)
	{
		return;
	}
	//printf("build start\n");
	for (unsigned int i = (ArraSize-1)/2+1; i >0; --i)
	{
		MinHeapFixDown(Arra,i-1,ArraSize);
	}
	//printf("build end\n");
}

void HeapSort(int Arra[],unsigned int ArraSize)
{
	BuildMinHeap(Arra,ArraSize);
	printf("ArraSize=%d\n",ArraSize);
	for (unsigned int i = ArraSize-1; i >=1; --i)
	{
		Swap(Arra,0,i);
		MinHeapFixDown(Arra,0,i);
	}
}

int main()
{
	//int Arra[]={-6,-8,9,-3,-1,0,13,-15,28,-40};
	int Arra[]={-6,10,-7,15,-9,12,50,-35,9};
	HeapSort(Arra,sizeof(Arra)/sizeof(Arra[0]));

	for (int i = 0; i < sizeof(Arra)/sizeof(Arra[0]); ++i)
	{
		printf("%d,",Arra[i] );
	}

	printf("\n");
}




目录
相关文章
|
22小时前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
21 10
|
8月前
|
算法 Java
数据结构奇妙旅程之二叉树题型解法总结
数据结构奇妙旅程之二叉树题型解法总结
|
8月前
|
搜索推荐 算法 Shell
【数据结构入门精讲 | 第七篇】一文讲清全部排序算法(1)
【数据结构入门精讲 | 第七篇】一文讲清全部排序算法(1)
41 0
|
8月前
|
算法 计算机视觉
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
99 0
|
8月前
|
存储 搜索推荐 算法
【数据结构入门精讲 | 第八篇】一文讲清全部排序算法(2)
【数据结构入门精讲 | 第八篇】一文讲清全部排序算法(2)
43 0
|
存储 机器学习/深度学习 算法
数据结构与算法之二 排序
数据结构与算法之二 排序
36 0
|
存储 搜索推荐 算法
数据结构与算法之三 深入学习排序
数据结构与算法之三 深入学习排序
43 0
|
存储 人工智能 搜索推荐
排序算法——参考《王道考研》+《大话数据结构》
排序算法——参考《王道考研》+《大话数据结构》
171 0
|
搜索推荐 测试技术
[数据结构 -- 手撕排序第二篇] 一篇带你详细了解希尔排序
[数据结构 -- 手撕排序第二篇] 一篇带你详细了解希尔排序
|
搜索推荐
[数据结构 -- 手撕排序第一篇] 插入排序
[数据结构 -- 手撕排序第一篇] 插入排序

热门文章

最新文章

下一篇
开通oss服务