堆用数组来实现,但是其中元素有顺序,满足最大(小)堆的性质,如a[i]>a[i+1]&&a[i]>a[i+2],堆排序的思想是对于一个无序的数组,首先建堆,然后将第一个元素与最后一个元素交换位置,这样因为第一个元素是最大(小)值,就可以取出来了,再对其余N-1个元素进行堆得整理,代价为logn,然后再次取出第一个元素,以此类推,总的排序代价为O(N*logN)。注意建堆的代价为O(N)。
C++的实现代码如下:
/*
堆排序算法:最大时间复杂度为O(N*logN),即每次交换到堆顶的元素都是最小的,这样堆整理的操作时间最长
堆排序与选择排序算法相似,只不过选择排序每次选出一个当前最大元素时都需要比较n-1次(n一直在递减),
即他没有记录其他元素的大小关系,这样导致每次都需要进行很多次重复比较,而堆排序则把其他元素放在堆中
堆是有序的,这样减少了每次选出最大元素的比较次数,因为其他元素的大小关系已经确定,不用再比较
*/
#include <iostream>
#include <algorithm>
using namespace std;
void heapAdjust(int *a, int i, int size);
void heapSort(int *a, int size);
void buileHeap(int *a, int size);
int main()
{
int i, size;
int a[100];
while(scanf("%d", &size)==1&&size>0)
{
cout<<"size is "<<size<<endl;
for(i=1;i<=size;i++) //节点序号从1开始,方便后续的堆操作
{
cin>>a[i];
}
cout<<"input over"<<endl;
buileHeap(a, size);
heapSort(a, size);
for(i=1;i<=size;i++)
cout<<a[i]<<",";
cout<<endl;
}
return 0;
}
/*调整堆的函数*/
void heapAdjust(int *a, int i, int size)
{
int leftchild=2*i;
int rightchild=2*i+1;
int max=i;
if(i<=size/2)
{//cout<<"i="<<i<<endl;
if(leftchild<=size&&a[leftchild]>a[max]) //注意判断leftchild和rightchild的范围是否超过了size
max=leftchild;
if(rightchild<=size&&a[rightchild]>a[max])
max=rightchild;
if(max!=i)
{
swap(a[i], a[max]);
heapAdjust(a, max, size); //只有max不等于i时才递归调用,否则会死循环
}
}
return;
}
/*堆排序函数*/
void heapSort(int *a, int size)
{
buileHeap(a, size);
int i;
for(i=size;i>1;i--)
{
swap(a[1], a[i]); //每次把最大元素交换到最后的位置
heapAdjust(a, 1, (i-1)); //注意此处的第三个参数应该是当前堆的长度减1
}
return;
}
/*建堆函数*/
void buileHeap(int *a, int size)
{
int i;
for(i=size/2;i>0;i--) //非叶节点的序号最大为size/2,注意节点序号从1开始,这样方便。
{
heapAdjust(a, i, size);
}
}
分享到:
相关推荐
算法设计课程中的最小堆排序算法实现,windows下实现。
自己编写的堆排序算法实现函数,本人亲测过绝对好使的代码,在这里与大家分享交流,希望能够给你带来帮助
C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。
基于FPGA的堆排序算法实现与改进.pdf
Building a heap using heapfying堆排序算法的实现即通过保持堆的特性,建堆,并实现对数组的排序操作。
简单的堆排序算法:以定长数组为例,动态数组等可以以此类推
java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。
用c语言实现堆排序算法,堆排序算法的实现,分析堆排序算法
包括堆排序算法实现,直接插入排序算法实现和快速排序算法实现。
1、 实现堆排序算法。 2、 理论分析并实验验证堆排序算法的时间复杂度。
7大排序算法(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)实现源码
内部堆排序算法的实现课程设计说明书.doc
解决算法中求若干个数的前N位,堆排序是最佳选择。
// 堆排序 #include typedef int InfoType; // 定义其它数据项的类型 #include "compare.h" #include "sort.h" typedef SqList HeapType; // 堆采用顺序表存储表示 void HeapAdjust(HeapType &H,int s,int m) // ...
学习堆排序时自己编的代码,里面有自动生成随机数的代码段方便大家测试
C++实现希尔、快速、堆排序、归并排序算法,一些中文注释可能成乱码了,但是不影响代码执行。
使用C语言编写的数据结构程序,为堆排序算法的实现。可作为课程设计题目来做。
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο...