堆排序模板

 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],a[j]);
11 }
12 void heapDown(int a[],int i,int n)//恢复
13 {
14     for(int j=i<<1;j<=n&&a[i]>a[j];i=j,j<<=1)
15     {
16         if(j+1<=n&&a[j+1]<a[j])    j++;
17         swap(a[i],a[j]);
18     }
19 }
20 void heapDel(int a[],int n)//删除
21 {
22     swap(a[1],a[n]);
23     heapDown(a,1,n);
24 }
25 void makeHeap(int a[],int n)//构建
26 {
27     for(int i=n/2;i;--i)
28         heapDown(a,i,n);
29 }
30 void heapSort(int a[],int n)//堆排序
31 {
32     for(int i=n;i;--i)
33     {
34         swap(a[i],a[1]);
35         heapDown(a,1,i-1);
36     }
37 }
38 int main()
39 {
40     int a[12]={0,1,6,4,3,8,2};
41     makeHeap(a,6);
42     heapAdd(a,7,5);
43     heapSort(a,7);
44     for(int i=1;i<=7;i++)
45         printf("%d%c",a[i],i==7?‘\n‘:‘ ‘);
46     return 0;
47 }

注意:使用小根堆排序后是递减数组,要得到递增数组,可以使用大根堆。

在堆排序好后再添加元素,需要重新建堆并且排序。

  由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。二次操作时间相加还是O(N * logN)。故堆排序的时间复杂度为O(N * logN)。

参考文章:http://blog.csdn.net/morewindows/article/details/6709644/

时间: 2024-10-14 20:26:30

堆排序模板的相关文章

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

堆 一些注意点:左儿子的编号是自己的编号*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,

堆排序【模板】

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]<=h

模板化的七种排序算法,适用于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(