利用上一节的最大堆,中间省略了很多该删和修改的东西,总是时学习算法吗~~~~~懒了一些啊,O(∩_∩)O
#include <stdio.h>
#include <stdlib.h>
struct heap{
int *data;
int size;
};
int paraent(int i);
int leftchild(int i);
int rightchild(int i);
void max_heap(int data[],int i,int len);
void bulid_max_heap(int data[],int len);
void heap_sort(int data[],int len);
int heap_max(struct heap *m_heap);
void printFF(struct heap *m_heap);
void insert(struct heap *m_heap,int data);
int main()
{
int nData[20] = {9,8,7,6,5,4,3,2,1,0}; //创建10个数据,测试
bulid_max_heap(nData,10);
struct heap *m_heap=(struct heap *)malloc(sizeof(struct heap));
m_heap->data=nData;
m_heap->size=10;
for (int i = 0; i < 10; ++i)
{
printf("%d ", nData[i]);
}
int temp=heap_max(m_heap);
printf("%d ", temp);
printf("/n");
printFF(m_heap);
printf("/n");
temp=heap_max(m_heap);
printf("%d ", temp);
printf("/n");
printFF(m_heap);
printf("/n");
insert(m_heap,13);
insert(m_heap,7);
printFF(m_heap);
printf("/n");
temp=heap_max(m_heap);
printf("%d ", temp);
printf("/n");
printFF(m_heap);
printf("/n");
system("puase");
return 0;
}
void printFF(struct heap *m_heap)
{
for(int i=0;i<m_heap->size;i++)
printf("%d ", m_heap->data[i]);
printf("/n");
}
int paraent(int i)
{
return (i-1)/2;
}
int leftchild(int i)
{
return 2*i+1;
}
int rightchild(int i)
{
return 2*(i+1);
}
void max_heap(int data[],int i,int len)
{
int l=leftchild(i);
int r=rightchild(i);
int largest;
if(l<len&&data[l]>data[i])
largest=l;
else
largest=i;
if(r<len&&data[r]>data[largest])
largest=r;
if(largest!=i)
{
int temp=data[i];
data[i]=data[largest];
data[largest]=temp;
}
else
return;
max_heap(data,largest,len);
}
void bulid_max_heap(int data[],int len)
{
int num=(len-2)/2;
for(int i=num;i>=0;i--)
max_heap(data,i,len-1);
}
int heap_max(struct heap *m_heap)
{
int max=m_heap->data[0];
int temp=m_heap->data[0];
m_heap->data[0]=m_heap->data[m_heap->size-1];
m_heap->data[m_heap->size-1]=temp;
m_heap->size--;
max_heap(m_heap->data,0,m_heap->size);
return max;
}
void insert(struct heap *m_heap,int data)
{
m_heap->size++;
m_heap->data[m_heap->size-1]=data;
int i=m_heap->size-1;
while(i>0&&m_heap->data[paraent(i)]<m_heap->data[i])
{
int temp=m_heap->data[i];
m_heap->data[i]=m_heap->data[paraent(i)];
m_heap->data[paraent(i)]=temp;
i=paraent(i);
}
}