我正在尝试在程序中实现Heap排序,以了解有关排序算法的更多信息。但是我遇到了一个问题。
我像这样称呼Heap sort:
主要
heap_sort(h_vector);
其中h_vector是具有随机有序元素的随机大小的向量。我的堆排序算法看起来像。
堆排序:
void max_heapify(std::vector<int>& v, int i)
{
int left = i + 1, right = i + 2;
int largest;
if( left <= v.size() && v[left] > v[i])
{
largest = left;
}
else
{
largest = i;
}
if( right <= v.size() && v[right] > v[largest])
{
largest = right;
}
if( largest != i)
{
std::swap(v[i], v[largest]);
max_heapify(v,largest);
}
}
void build_max_heap(std::vector<int>& v)
{
for( int i = v.size() - 2; i >= 0; --i)
{
max_heapify(v, i);
}
}
void heap_sort(std::vector<int>& v)
{
build_max_heap(v);
int x = 0;
int i = v.size() - 1;
while( i > x)
{
std::swap(v[i],v[x]);
++x;
--i;
}
}
每当我将此类添加到我的程序中时,我都会收到以下错误。
错误:
*** glibc detected *** ./a.out: free(): invalid next size (normal): 0x096c82d0 ***
我不确定是什么原因引起的。我一开始以为我的算法可能超出了向量的范围,但我已经检查了几次而且我没有看到哪里。有任何想法吗?感谢您的帮助。
答案 0 :(得分:4)
在max_heapify()
的第一次调用中,您使用i = v.size() - 2
因此,当您设置right = i + 2;
实际设置时:right = v.size()
现在,看看这个:
if( right <= v.size() && v[right] > v[largest])
请注意right <= v.size()
,您现在正在尝试访问超出范围的v[right]
。
请注意,v
的最后一个索引为v[v.size() -1]
- 所以您的所有if语句都应为right < v.size()
[而不是<=
]
我认为解决这些问题最终会解决你的错误。
答案 1 :(得分:0)
build_max_heap()中的“for”循环正在向后运行。你无法以这种方式构建堆。首先将数组的第一个元素作为堆开始,然后向其中添加后续元素。这从最后开始不起作用,因为数组的其余部分还不是堆。
另外,amit说道。
特别是,堆将由数组和堆的大小定义 - 而不是数组,因为它并不总是堆的所有部分。所以你错过了一个参数(堆大小)。整个数组是堆的唯一时间是在build_max_heap()完成之后,在运行第二次传递以将其拉入排序顺序之前。在每隔一次,堆大小不是数组大小。
答案 2 :(得分:-1)
#include <stdio.h>
#include <stdlib.h>
int a[90],n;
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void ct_heap(int n)
{
int j,data,i;
for(i=0;i<n;i++)
{
data=a[i];
for(j=i;j>0;j--)
{
if(a[(i-1)/2]<data)
{
swap(&a[(i-1)/2],&a[i]);
i=(i-1)/2;
}
}
}
}
void display()
{
int k;
for(k=0;k<n;k++)
{
printf("%d\t",a[k]);
}
printf("\n");
}
void heap_sort()
{
ct_heap(n);
int end;
end=n-1;
while(end>=0)
{
swap(&a[end],&a[0]);
ct_heap(end);
end=end-1;
}
}
int main()
{
int i;
printf("Enter Number of Nodes\n");
scanf("%d",&n);
printf("Enter Data\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("After Heap Creation\n");
ct_heap(n);
display();
heap_sort();
printf("Array After Heap Sort\n");
display();
return 0;
}