堆排序【模板】

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 int x,size,n;
 7 int heap[1000005];
 8
 9 void push(int x)
10 {
11     int now,next;
12     heap[++size]=x;
13     now=size;
14     while(now>1)
15     {
16         next=now/2;
17         if(heap[next]<=heap[now]) return ;
18         swap(heap[next],heap[now]);
19         now=next;
20     }
21 }
22
23 int pop()
24 {
25     int now,next;
26     int ret=heap[1];
27     heap[1]=heap[size--];
28     now=1;
29     while(now*2<=size)
30     {
31         next=now*2;
32         if(next<size&&heap[next]>heap[next+1]) next++;
33         if(heap[now]<=heap[next]) return ret;
34         swap(heap[now],heap[next]);
35         now=next;
36     }
37     return ret;
38 }
39
40 int main()
41 {
42     scanf("%d",&n);
43     for(int i=1;i<=n;i++)
44     {
45         scanf("%d",&x);
46         push(x);
47     }
48     for(int i=1;i<n;i++)
49     {
50         int ans=pop();
51         printf("%d ",ans);
52     }
53     printf("%d\n",pop());
54     return 0;
55 }
时间: 2024-10-12 13:46:25

堆排序【模板】的相关文章

堆排序模板

1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 //小根堆 6 void heapAdd(int a[],int i,int num)//添加 7 { 8 a[i]=num; 9 for(int j=i>>1;j&&i&&a[i]<a[j];i=j,j>>=1) 10 swap(a[i

加工并存储数据的数据结构

堆 一些注意点:左儿子的编号是自己的编号*2+1右儿子的编号是自己的编号*2+2父亲节点的编号是(自己的编号-1)/2 手动实现的堆,贴一段书上的代码: 1 #include <iostream> 2 3 using namespace std; 4 5 int const MAX_N=233333; 6 int heap[MAX_N]; 7 int sz,n; 8 9 void push(int); 10 int pop(void); 11 12 int main() 13 { 14 cin

堆排序学习以及模板

堆排序学习以及模板 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 堆排序的平均时间复杂度为Ο(nlogn) . 算法步骤: 1.创建一个堆H[0..n-1](利用MaxHeapify函数从最后一个非叶子节点开始调整堆,如BuildMaxHeap函数调整为大根堆). 2.把堆首(最大值)和堆尾互换(取堆顶元素,因为其总是当前堆中最大或者最小的) 3.把堆的尺寸缩小1,

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

Vector模板类

1 #include "stdafx.h" 2 typedef int Rank; //秩 3 #define DEFAULT_CAPACITY 3 //默认的初始容量(实际应用中可设置为更大) 4 5 template <typename T> class Vector 6 { //向量模板类 7 protected: 8 Rank _size; int _capacity; T* _elem; //规模.容量.数据区 9 void copyFrom(T const* A

c++ 堆的创建 堆排序

#pragma once #include<iostream> #include<vector> using namespace std; class BigHeap//仿函数类  大堆返回true { public: bool operator()() { return true; } }; class SmallHeap//仿函数类  小堆返回false { public: bool operator()() { return false; } }; template <

堆排序算法思路详解

堆排序是一种常见的排序算法,其时间复杂度为O(logN),重要思想为建堆取极值,根据需求进行排序,如下图: 值得思考的是,二次建堆的过程中,实际上是没有必要将所有元素都进行下调,只需要将根进行下调: 实现代码如下: template <class T>//建立仿函数模板满足排序需求 struct CompMax { bool operator()(const T& a, const T& b) { return a > b; } }; template <class

[数据结构]最小堆的类模板实现

堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构. 它的特点是父节点的值大于(小于)两个子节点的值(分别称为最大堆和最小堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 1.根结点若有子树,则子树一定也是堆. 2.根结点一定大于(或小于)子结点. 因为要求堆必须是完全二叉树,所以可以用线性的数据结构,比如数组,来实现堆. 利用数组实现,则对于长为N的堆中的元素从0到N-1排列,有: i的父结点:Parent(i)=(i+1)/2-1 i的左叶子:Left(i)=(

常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)

这篇博客主要实现一些常见的排序算法.例如: //冒泡排序 //选择排序 //简单插入排序 //折半插入排序 //希尔排序 //归并排序 //双向的快速排序 //单向的快速排序 //堆排序 对于各个算法的实现原理,这里不再多说了,代码中注释较多,结合注释应该都能理解算法的原理,读者也可自己google一下.另外,注释中有很多点,比如边界条件.应用场景等已经用 * 标记,* 越多,越应该多注意. 下面是实现: //冒泡排序 void BubbleSort(int *arr, int n) { if(