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

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

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


下例是最小堆


#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");
}


时间: 2024-09-18 14:20:53

温故知新,基础复习(二叉堆排序)的相关文章

温故知新,基础复习(快速排序及优化)

温故知新,基础复习(快速排序及优化) 使用了三值取中和插排优化 #include<stdio.h> #define InsertSortNumber 10 void InsertSort(int Arra[],unsigned int LowIndex,unsigned int HighIndex) { printf("low=%d,high=%d\n",LowIndex,HighIndex); for (unsigned int i = LowIndex + 1; i &

理解二叉堆数据结构及Swift的堆排序算法实现示例_Swift

二叉堆的性质1.二叉堆是一颗完全二叉树,最后一层的叶子从左到右排列,其它的每一层都是满的 2.最小堆父结点小于等于其每一个子结点的键值,最大堆则相反 3.每个结点的左子树或者右子树都是一个二叉堆 下面是一个最小堆: 堆的存储通常堆是通过一维数组来实现的.在起始数组为 0 的情形中: 1.父节点i的左子节点在位置 (2*i+1); 2.父节点i的右子节点在位置 (2*i+2); 3.子节点i的父节点在位置 floor((i-1)/2); 维持堆的性质我们以最大堆来介绍(后续会分别给出最大堆和最小堆

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对) #include<stdio.h> #include<stdlib.h> void PrintSumNumbers(int Arra[],int ASize,int Sum) { //O(1) if (ASize<2) { printf("The size of the Arra is invalid.\n"); return; } if(Sum&

算法起步之二叉搜索树

原文:算法起步之二叉搜索树         学习二叉搜索树之前,我们先复习一下树的相关知识,数是几种经典的数据结构之一,树其实就是维护了一对多的关系,一个节点可以有多个孩子,但是每个节点至多只有一个双亲.如何去描述存储一棵树呢,这里方法有很多,数组.链表.十字链表等等.这里我们主要研究二叉树,二叉树是树的一种特殊形式,节点至多只有两棵子树,有左右之分次序不能任意颠倒.二叉树还有一个性质就是叶子节点的个数=度为2的节点+1 .二叉搜索树又叫二叉排序树或二叉查找树.他比二叉树又加个1个性质,就是左子

数据结构 之 二叉堆(Heap)

注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树(complete binary tree).下图就是这样一个例子.         对于完全二叉树,有这样一些性质:     (1).一棵高h的完全二叉树,其包含2^h ~ (2^(h+1) - 1)个节点.也就是说,完全二叉树的高是[

二叉搜索树与树的遍历非递归练习

复习了二叉搜索树的实现,包括插入.查找和删除操作,顺便做了下二叉树的三种遍历操作.全部操作采用非递归方式.   #include<iostream>   #include<stack>   using namespace std;     typedef int T;   // 值类型      // 节点定义    struct node {       T val;       node *left,*right;       node(const T& val):va

结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆

实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等.   1. 二叉堆  1.1. 定义 完全二叉树,根最小. 存储时使用层序.   1.2. 操作 (1). insert(上滤) 插入末尾 26,不断向上比较,大于26则交换位置,小于则停止.   (2). deleteMin(下滤) 提取末尾元素,放在堆顶,不断下滤:   (3). 其他操作: 都是基于insert(上滤)与deleteMin(下滤)的操作. 减小元素:减小节点的值,

c++-二叉搜索树的遍历问题

问题描述 二叉搜索树的遍历问题 #include<iostream> #include<string> using namespace std; class node{ public: string name; string keyword; node* left; node* right; node(string a = 0, string b = 0, node* c = 0, node* d = 0) : name(a), keyword(b), left(c), right

[华为机试练习题]33.二叉搜索树

题目 描述: 判断两序列是否为同一二叉搜索树序列 题目类别: 树 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES