堆排序出现有时正确有时错误的问题,找不出问题出在哪
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
void swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void heapinsert(int arr[],int index)
{
while(arr[index] > arr[(index - 1) / 2])
{
swap(&arr[index],&arr[(index - 1) / 2]);
index = (index - 1) / 2;
}
}
void heapify(int arr[],int index,int heapsize)
{
int left=2 * index + 1;
while(left < heapsize)
{
int largest = (left+1 < heapsize && arr[left+1] > arr[left]) ? left+1 : left;
largest = index > largest ? index : largest;
if(index == largest)
break;
swap(&arr[index],&arr[largest]);
index = largest;
left=2 * index + 1;
}
}
void HeapSort(int arr[],int heapsize)
{
int i;
for(i=0;i<N;i++)
{
heapinsert(arr,i); //使二叉树变成大根堆
}
/* for(i=N-1;i>=0;i--)
{
heapify(arr,i,N);
} */
swap(&arr[0],&arr[--heapsize]); //最大值与数组最后一个节点交换,同时缩小heapsize
while(heapsize>0)
{
heapify(arr,0,heapsize); //O(logN)
swap(&arr[0],&arr[--heapsize]);
}
}
int main(void)
{
int i;
int arr[N];
srand(time(NULL));
for(i=0;i<N;i++)
{
arr[i]=rand()%101;
}
for(i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
HeapSort(arr,N);
for(i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
return 0;
}