汗,别人都说大小顶堆只是改改大于号的问题,可我的代码从大顶堆只改动大于号调整为小顶堆竟然越界乐,掣肘!!
后来几经更改才发现是传参的问题(见代码),看来大顶堆改小顶堆不是¥%…#¥…,亦或是我RP出点问题???搞笑的是代码砖头(C::B)竟然对越界错各种容忍,于是乎平常尽量少用,孰不知越界问题很严重。。放码子:
- #include<iostream>//大顶堆
- using namespace std;
- void heap(int *p_a,int head,int tail)//调整成为一个大顶堆
- {
- int tmp;
- tmp=p_a[head];//暂存根节点
- int j;
- for(j=2*head;j<=tail;j*=2)//沿节点值较大的儿子往下层筛选,2*j是左儿子,2*j+1是右儿子
- {
- if(j<tail && p_a[j]<p_a[j+1])//如果右儿子大于左儿子,j++转移到右儿子 更改大小的地方
- ++j;
- if(tmp>=p_a[j])//更改大小的地方
- break;
- p_a[head]=p_a[j];//较大的儿子向父节点平移,并更新head节点的位置
- head=j;
- }
- p_a[head]=tmp;//将根节点放置到最后空出的合适的位置
- }
- void h_sort(int *pz,int len)
- {
- int i;
- for(i=len/2;i>0;--i)//初建大顶堆,根是个最大的,叶子们最小
- heap(pz,i,len);
- int tmp;
- tmp=pz[0];
- pz[0]=pz[len-1];
- pz[len-1]=tmp;//以上为交换堆顶和堆底,下面开始调整一次,交换一次
- for(i=len-1;i>1;--i)//从根开始调整,调完后交换堆顶和堆底***********小顶堆竟然从len开始调整
- {
- heap(pz,0,i);
- tmp=pz[0];
- pz[0]=pz[i];
- pz[i]=tmp;
- }
- }
- int main()
- {
- int n;
- int pz[100];
- scanf("%d",&n);
- int i;
- for(i=0;i<n;++i)
- scanf("%d",&pz[i]);
- h_sort(pz,n);
- for(i=0;i<n;++i)
- printf("%d ",pz[i]);
- return false;
- }
- ************************小顶堆**********
- #include<iostream>
- using namespace std;
- void heap(int *p_a,int head,int tail)//调整成为一个小顶堆
- {
- int tmp;
- tmp=p_a[head];//暂存根节点
- int j;
- for(j=2*head;j<=tail;j*=2)//沿节点值较小的儿子往下层筛选,2*j是左儿子,2*j+1是右儿子
- {
- if(j<tail && p_a[j]>p_a[j+1])//如果右儿子小于左儿子,j++转移到右儿子
- ++j;
- if(tmp<=p_a[j])
- break;
- p_a[head]=p_a[j];//较小的儿子向父节点平移,并更新head节点的位置
- head=j;
- }
- p_a[head]=tmp;//将根节点放置到最后空出的合适的位置
- }
- void h_sort(int *pz,int len)
- {
- int i;
- for(i=len/2;i>0;--i)//初建小顶堆,根节点值最小的,叶子们最最大
- heap(pz,i,len);
- int tmp;
- /*tmp=pz[0];
- pz[0]=pz[len-1];
- pz[len-1]=tmp;*///以上为交换堆顶和堆底,下面开始调整一次,交换一次
- for(i=len;i>1;--i)//从根开始调整,调完后交换堆顶和堆底,小顶堆竟然跟大顶堆不一样的起点
- {//既然不一样,那上面初始的调整就多余了
- heap(pz,0,i);
- tmp=pz[0];
- pz[0]=pz[i];
- pz[i]=tmp;
- }
- }
- int main()
- {
- int n;
- int pz[1000];
- scanf("%d",&n);
- int i;
- for(i=0;i<n;++i)
- scanf("%d",&pz[i]);
- h_sort(pz,n);
- for(i=0;i<n;++i)
- printf("%d ",pz[i]);
- return false;
- }