堆排序出错,不清楚哪有问题

堆排序出现有时正确有时错误的问题,找不出问题出在哪

#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;
} 

img