堆排序之二

原创 2013年12月05日 21:22:32

昨天后来做堆排序算法时候卡住了,今天解决了半天,最后发现居然是一个<=还是<的问题。这样的错误已经至少两次了,为啥就是不能避免呢。

利用昨天做的heapify函数,实现堆排序。原则就是每次形成一个大根堆,然后把最大的扔到最后去,再对前面剩下的那些排序,生成大根堆,每次这样,直到最后大根堆中只有一个元素。

#include<iostream>
using namespace std;


int N(11);


void heapify(int a[],int i)
{
int l,r,largest,temp;
l=2*i;
r=2*i+1;
//find the largest one in i,l,r.
if (l<N && a[l]>a[i])
largest=l;
else largest=i;
if(r<N && a[r]>a[largest])
largest=r;
//cout<<"largest="<<largest<<endl;
//if i is not the largest one,exchange.
if(largest!=i)
{temp=a[i];
a[i]=a[largest];
a[largest]=temp;
cout<<"largest="<<largest<<" "<<a[largest]<<endl;

//use largest to do the next check.
heapify(a,largest);
}
//else heapify(a,l);
}


int main()
{
int a[]={0,4,1,3,2,16,9,10,14,8,7};
for(int i=N;i>0;i--)
{
heapify(a,i);
}
for(int j=1;j<N;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;


for(int t=N-1;t>=1;t--)

{
N--;
int tt;
tt=a[t];
a[t]=a[1];
a[1]=tt;
cout<<"N="<<N<<" ";
cout<<"a["<<t<<"]="<<a[t]<<"  a[1]="<<a[1]<<endl;
heapify(a,1);


for(int j=1;j<11;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
}

算法外功修炼之二 堆排序的java实现

从下往上,每个非叶子节点都比较一次,那么到最后所有节点都满足了堆的性质,这就是建堆。 堆排序,一种建立在虚拟堆,真实数组上的排序方式 建立堆和调整堆有什么区别呢,或者说为什么要建立堆? 我认为,建立堆...

排序算法之二 堆排序

一、说在前面的理论 1. 定义:         堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全...

【数据结构和算法】排序算法之二:选择排序和堆排序

一  选择排序 (1)思想 假设有十张扑克牌放在桌上,我们需要按从小到大的顺序拿到手上,每次只能选择一张牌拿到手上,那么每一次我们都必须从桌上的扑克牌中选择最小的牌拿起来,一次循环十次,这样就将扑克牌...

数据结构之二叉堆(构建堆,堆排序)

public class Heap       {              public static void main(String[] args)               {       ...

数据结构之二叉堆(构建堆,堆排序)-(七)

/* * 堆的性质(最小堆为例): * 0.根节点为最小值 * 1.堆可以看做是一个完全二叉树(即孩子节点从左向右排列) * 2.堆的高度lgn/lg2(n为...
  • yilip
  • yilip
  • 2015年04月23日 21:16
  • 1924

排序算法---之二叉树堆排序

堆是完全二叉树的结构,并且,节点都比子节点上的值大或者小。这就是对,由此可见,依次输出堆的最顶端元素,就能得到一个有序的序列,那么关键的问题就是如何把一个无序的序列建成一个堆?输出堆最顶端元素后,如何...
  • hgd613
  • hgd613
  • 2016年01月21日 11:18
  • 250

java数组排序之二

  • 2011年10月04日 19:47
  • 672B
  • 下载

算法与数据结构(二)--堆排序算法(最大堆)

#include #include using namespace std; void keepmaxheap(int *a,int i,int size) { int l = 2*i+1; i...

程序员必知的8大排序(java实现)(二)(堆排序)

4、堆排序   (1)基本思想:   堆排序是一种树形选择排序,是对直接选择排序的有效改进。   堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=...

学习《算法导论》第六章 堆排序 总结二

在《堆排序_学习总结一》中学习了堆的概念, 最大堆的性质, 以及如何保持最大堆性质、如何建立堆这两个的算法. 最后就是基于这两个算法学习了堆排序的算法. 接下来继续学习几个关于堆的算法. 堆作为一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序之二
举报原因:
原因补充:

(最多只允许输入30个字)