STL经典算法集锦<二>之堆算法

原创 2012年03月24日 19:55:27
               堆算法主要包括建立最大堆和堆排序算法。所使用建堆的数组将以0开始存储数据。

下面将以两种方法建堆:自底向上的建堆(STL和算法导论中使用到的)、自顶向下建堆(即插入建堆的方法)

公共操作:

int parent(int i)
{
    return (int)((i-1)/2);
}
 
int left(int i)
{
    return 2 * i+1;
}
 
int right(int i)
{
    return (2 * i + 2);
}

版本一:自底向上

void heapShiftDown(int heap[], int i, int heap_size)
{
    int l = left(i);
    int r = right(i);
    int largest=i;
	//找出左右字节点与父节点中的最大者
    if(l < heap_size && heap[l] > heap[largest])
        largest = l;
    if(r < heap_size && heap[r] > heap[largest])
        largest = r;
	//若最大者不为父节点,则需交换数据,并持续向下滚动至满足最大堆特性
    if(largest != i)
    {
		swap(heap[largest],heap[i]);
        heapShiftDown(heap, largest, heap_size);
    }
}
 //自底向上的开始建堆,即从堆的倒数第二层开始
void buildHeap(int heap[],int heapSize)
{
    for(int i = (heapSize-1)/2; i >= 0; i--)
    {
        heapShiftDown(heap, i, heapSize );
    }
}
 
版本二:自顶向下的建堆

//i为新插入节点的位置
void heapShiftUp(int heap[], int i)
{
    int p=parent(i);
	//判断插入新节点后是否满足最大堆
	//否则交换数据并持续向上滚动
    if( heap[i] > heap[p])
	{		
			swap(heap[i],heap[p]);
			if(p != 0)
					heapShiftUp(heap,p);
	}
}
 
void buildHeap(int heap[],int heapSize)
{
	//自第二层开始建堆
    for(int i = 1; i < heapSize; i++)
    {
        heapShiftUp(heap, i);
    }
}

堆排序:

void heapSort(int heap[], int heapSize )
{
    buildHeap(heap,heapSize);
    for(int i = heapSize- 1; i > 0; i--)
    {
		swap(heap[0],heap[i]);
                heapShiftDown(heap, 0, i);
    }
}

测试代码:

int main()
{
		int len=20;
		int array[len];
		srand(time(0));
		for(int i=0;i<len;i++)
				array[i]=rand()%200;
		heapSort(array,len);
		for(int i=0;i<len;i++)
				cout<<array[i]<<"\t";
		return 0;
}
单次运行结果:

自底向上:


自顶向下:


相关文章推荐

STL经典算法集锦<三>之partition与qsort

STL的分割算法主要使用了仿函数来实现。而此处的分割则不,此处实现了两种形式的分割算法:非随机分割算法、随机分割算法(随机算法是在非随机算法的基础上封装而成)。而快速排序则只需简单依赖分割算法就能实现...

STL经典算法集锦<六>之排列(next_permutation/prev_permutation)

STL中涉及到数组的排列的有两个函数,即next_permutation/prev_permutation,分别用于求上一个以及下一个排列。两函数的算法使用的原理大体相同。以next_permutat...

STL经典算法集锦<七>之随机洗牌(random_shuffle)

将一个数组中的元素序列打算顺序进行重排,并需要保证重排后的每一种结果是等概率且随机的。下面的两种算法哪一种是正确的?(注:random(a,b)返回一个a~b的随机整数) 1. for i=1 to...

STL经典算法集锦<一>之list::sort

算法中使用到的数据结构: typedef struct Node* Link; struct Node{ int value; Link next; };算法代码: //链表的归并 void ...

STL经典算法集锦<四>之rotate

STL在rotate上的优化是极尽其所能的。分别对前向访问,双向访问,随机访问的数据结构实现了三个版本的rotate。下面是自己按照对三种算法的理解,自己进行的实现。实现中我尽力避免使用C++的特性,...

STL经典算法集锦<八>之IntroSort

STL的sort算法的优化策略: 1、  数据量大时采用QuickSort,分段递归排序。 2、  一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来的额外负荷,就改用Ins...

STL经典算法集锦<五>之查找(lower_bound/upper_bound/binary_search)

这三个算法都比较的常用,而且具有一定的相似的性。理论依据也很明显,下面就直接贴出自己的实现版本。其中lower_bound与upper_bound实现了两个版本。版本一与STL的实现方法完全相同,以数...

十三个经典算法集锦

作者:July。 微博:http://weibo.com/julyweibo。 出处:http://blog.csdn.net/v_JULY_v。 前言     本人的原创作品,经典算法研究系...

Java 经典算法面试题集锦

1.随机产生20个不能重复的字符并排序 package com.test.kaoshi; import java.util.HashSet; import java.util.Iterator; ...

计算机经典算法 集锦

  • 2008年11月01日 11:16
  • 877KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL经典算法集锦<二>之堆算法
举报原因:
原因补充:

(最多只允许输入30个字)