建堆,以及对堆排序
代码:
#include
int h[101];//用来存放堆的数组
int n;//用来存储堆中元素的个数,就是堆的大小
//交换函数,用来交换堆中的俩个元素的值
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}
//向下调整函数
void siftdown(int i)
{/...
分类:
编程语言 时间:
2015-08-13 12:09:32
阅读次数:
135
继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。
堆排序可分为两个阶段:
1.构建堆:在堆的构建过程中,我们将原始数组重新组织安排进一个堆中;
2.下沉排序:从堆中按递减顺序取出所有元素并得到排序结果
具体的思想在下面的代码中有较为详细的注释:
/**
*
* @author seabea...
分类:
编程语言 时间:
2015-07-26 17:29:37
阅读次数:
142
主要内容:1、什么是堆?2、如何建堆3、堆排序4、参考代码一、什么是堆?“堆”是个很有趣的数据结构,是个完全二叉树。“堆”的特性:每个节点的键值一定总是大于(或小于)它的父节点(大于:称为“最大堆”,小于:称为“最小堆”),或者说每个节点总是大于或小于它的子节点。对于最大堆而言,根节点为最大值;对于...
分类:
编程语言 时间:
2015-07-01 13:40:31
阅读次数:
161
堆的定义:1)完全二叉树,2)每个结点的值都大于其左右孩子结点的值。根据堆的定义可知,最大值就是根结点,其次就是根结点左右孩子结点中的一个……
堆排序有两个很重要的过程:1)建堆,2)堆维护。实质上,这两个过程都可以通过一个函数来实现。
void HeapAdjust(SqList* list, int obj, int length)
{
int tmp = lis...
分类:
编程语言 时间:
2015-06-30 08:58:41
阅读次数:
143
堆排序算法是建立在堆这种数据结构的基础上,其实堆听着很高端,其实很简单,就是一个二叉树,但是又特殊条件,就是其父节点比孩子节点都大(或都小)的堆称为最大堆(最小堆),瞬间感觉很简单了,最简单的保存方法就是直接用数组来保存。
给出一组数,我们要使用堆排序,首先需要建堆,但是这一组数首先肯定是不满足上面堆的性质的,所以我们需要调整,让他满足堆得性质,变成一个堆,怎么调整呢?拿最大堆来说,就是对于一个节...
分类:
编程语言 时间:
2015-06-22 22:21:57
阅读次数:
203
最近做了一个用Unity3D动态演示堆排序过程的程序。堆排序(Heap sort) 堆排序总是建立这样一个二叉树:其父结点总大于其子结点。 首先建堆。 每轮将根结点与最后一个结点互换,然后对剩余部分建堆。您可以在此下载安卓APK。
分类:
编程语言 时间:
2015-06-17 13:22:15
阅读次数:
169
1 /* 2 ** 算法的思路: 3 ** 1.将k个链表的首元素进行建堆 4 ** 2.从堆中取出最小的元素,放到链表中 5 ** 3.如果取出元素的有后续的元素,则放入堆中,若没有则转步骤2,直到堆为空 6 */ 7 8 9 #include 10 11 12...
分类:
其他好文 时间:
2015-06-17 00:24:07
阅读次数:
257
堆栈,都懂得。先进后出。直接看代码吧,实现以下功能:创建堆栈压入值弹出值查看栈顶值压入一组值
publicclassTheStack{
privateString[]stackArray;
privateintstackSize;
privateinttopOfStack=-1;
TheStack(intsize){
stackSize=size;
stackArray=newString[size];
Arr..
分类:
编程语言 时间:
2015-06-09 14:13:02
阅读次数:
220
堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占用一个存储空间。
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序区中选取最大(或最小)关键字的记录变得简单。我们以大跟堆为例子,排序的基本操作如下:
首先是建堆,建堆就是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从l...
分类:
编程语言 时间:
2015-05-28 21:38:10
阅读次数:
206
题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列,
让你求出序列和最小的前n个序列的序列和。
先介绍下堆的基本操作:
int arr[N];
make_heap(arr+1,arr+N);//对数组arr建堆,堆里第一个元素为最大值
pop_heap(arr+1,arr+N+1);//将第一个元素与最后一和元素交换
push_heap(ar...
分类:
其他好文 时间:
2015-04-28 22:55:15
阅读次数:
280