您的位置:首页 > 其它

堆排序

2013-12-31 09:32 155 查看
建堆的过程,堆排序 时间是  O(nlogn)  空间是O(1)只存在一个元素的交换

#include<iostream>

using namespace std;

//堆排序是 先建立最大或最小堆, 将堆顶和最后一个节点交换,去除最后一个节点,从这里开始循环 建立最大堆和最小堆,将堆顶交换,
//build heap
//注意范围限制的问题,不要超出 size
//template T 的应用
void adjustHeap(int *a, int size, int index);
void buildHeap(int *a,int size);
int main()
{
int data[]={1,3,6,9,11,16,2,7,0,8};
buildHeap(data,10);
for(int i = 0;i < 10;i++)
cout << data[i]<<" ";

return 0;
}

void adjustHeap(int *a, int size, int index)
{
int left = 2 * index + 1;//这里注意是从 0 开始的,所以左右子树是2i+1 和 left+ 1,从1 开始就不是了
int right = left + 1;
while(right < size) //这个判断不要忘记
{
if(a[left] >= a[index] && a[right] >= a[left])
return;
if (a[left] < a[right])//这里最小堆好了
{
swap(a[left], a[index]);
index = left;
}

else
{
swap(a[right],a[index]);
index = right;
}
left = 2 * index + 1;//这里注意是从 0 开始的,所以左右子树是2i+1 和 left+ 1,从1 开始就不是了
right = left + 1;
}
if(left < size && a[left] < a[index])//只有左子树的时候
swap(a[left],a[index]);
return;
}

void buildHeap(int *a,int size)
{
/*其实这就是一个建堆的过程*/
for(int i = size/2;i >=0;i--)//从下往上建立堆
adjustHeap(a,size,i);

for(int i = 0;i < 10;i++)
cout << a[i]<<" ";
cout<<endl;

while(size >0)
{
swap(a[0],a[size-1]);
size --;
adjustHeap(a,size,0);//每次都是从最开始进行调整
}
return;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: