堆排序(最大堆)

#include "iostream.h"
using namespace std;
//因为i从0开始
#define LeftChild(i) (2*(i)+1)
//i-N范围内,创建最大堆
void maxHeap(int A[], int i, int N){
	int tmp;
	int child;
	for(tmp=A[i];LeftChild(i)<N;i=child){
		child = LeftChild(i);
		if(child!=N-1&&A[child+1]>A[child]){
			child++;
		}
		if(tmp<A[child]){
			A[i]=A[child];
		}else
		    break;
	}
	A[i]=tmp;
}
void HeapSort(int A[], int N){
	//因为2*i不超过N,所以i从N/2开始
	for(int i=N/2;i>=0;i--){
		maxHeap(A,i,N);
	}
	for(int i=N-1;i>0;i--){
		//A[0]是最大堆的最大值,通过交换,把堆的最大值置于队尾
		swap(A[0],A[i]);
		//重建最大堆
		maxHeap(A,0,i);
	}
}

int main(int argc, char *argv[])
{
	int N;
	cin>>N;
	int A[100];
	for(int i=0;i<N;i++){
		cin>>A[i];
	}
	HeapSort(A,N);
	for(int i=0;i<N;i++){
		cout<<A[i]<<" ";
	}
	cout<<endl;
	return 0;
}

时间: 2024-12-30 02:10:57

堆排序(最大堆)的相关文章

堆的一些简单应用

查找数据 10000个数中找出最大的前100个数 创建一个100个数的小堆,最上面的数是这100个数中最小的:然后依次遍历(从101到10000),如果比它大,替换它. 代码实现如下: https://github.com/HandsomeBoby/Heap/blob/master/GetTopK.h 堆排序 使用大堆进行数组的排序 代码实现如下: https://github.com/HandsomeBoby/Heap/blob/master/HeapSort.h 最后,欢迎大神们评价.

十种JAVA排序算法实例

一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() {       for(int i=1;i<n;i++)       {         for(int j=0;i<n-i;j++) {               if(a[j]>a[j+1])//比较交换相邻元素                {                    int temp;                    temp=a[j]; a[j]=a[j+1]

10种排序算法总结

排序算法有很多,所以在特定情景中使用哪一种算法很重要.为了选择合适的算法,可以按照建议的顺序考虑以下标准: (1)执行时间 (2)存储空间 (3)编程工作    对于数据量较小的情形,(1)(2)差别不大,主要考虑(3):而对于数据量大的,(1)为首要.   主要排序法有: 一.冒泡(Bubble)排序——相邻交换 二.选择排序——每次最小/大排在相应的位置 三.插入排序——将下一个插入已排好的序列中 四.壳(Shell)排序——缩小增量 五.归并排序 六.快速排序 七.堆排序 八.拓扑排序 九

Java实现8中常用的排序

直接插入排序 import java.util.HashMap; /** * 直接插入排序 * @author HHF * 2014年3月19日 */ public class InsertSort { private static int contrastCount = 0;//对比次数 private static int swapCount = 0;//交换次数 public static void main(String[] args) { System.out.println("直接插

今天我们来谈谈堆

什么是堆 堆是一种特殊的树,他满足一下两点要求 堆是一个完全二叉树 堆中每一个节点的值都必须大于等于(或小于等于)其子树中的值 最大堆 最大堆和最小堆是二查堆的两种形式,最大堆和最小堆很相似,所以本文只实现最大堆以及堆排序 最大堆:根节点的键值是所有结点键值中的最大者,且每个结点的值都比孩子结点大 最小堆:根节点的键值是所有堆结点键值的最小者,且每个结点的值都比其孩子的值小. 索引关系 在最大堆中,设根节点索引从1开始,当父节点索引为i时,左子节点为2i,右子节点为2i+1 数据结构 堆的数据存

常见排序&amp;查询算法Java代码实现

1. 排序算法代码实现 /** * ascending sort * 外层循环边界条件:总共需要冒泡的轮数--每一轮都将最大或最小的数冒泡到最后 * 内层循环边界条件:冒泡数字移动的边界--最终数字需冒泡到此处 * 时间复杂度:O(n^2) * @param arr */ public static void bubbleSort(int[] arr) { if (arr == null) { throw new RuntimeException("Input arr is null!"

算法导论——最大堆,以及堆排序算法

本段代码实现了建堆,维护最大堆的性质,堆排序函数,优先队列的相关函数(插入,找最大值,提取出最大值,增加关键值,增加元素),以及相关的测试 1 #include <iostream> 2 #include <memory> 3 #include <iomanip> 4 #define LEFT(i) (2 * i) 5 #define RIGHT(i) (2*i + 1) 6 #define PARENT(i) (i >> 1) 7 8 using name

堆排序:什么是堆?什么是最大堆?二叉堆是什么?堆排序算法是怎么样的?PHP如何实现堆排序?

本文标签:  堆排序 php php算法 堆排序算法 二叉堆 数据结构 REST   服务器 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个"优秀"的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么是最大堆 堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆 因此,最大堆中的

堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)

对堆进行排序,利用大堆实现升序,小堆实现降序.例如升序的实现,将较大数据存放在最后面,依次往前存放数据.具体为交换第一个元素和最后一个元素,再将不包含最后一个元素的堆进行下调,使堆保持大堆,将最大数据存放在堆中第一个位置,循环执行上述步骤,直到需要下调的数据个数为0. void AdjustDown(int *a, size_t root, size_t size)//下调--k为数组下标,size为数组元素个数 {//大堆 size_t parent = root; size_t child