菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。
今天学习的是,
堆排序!!!
上代码:
#include <stdio.h>
#include <stdlib.h>
void swap1(int arr[],int i,int j)
{
int temp;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void heapify(int tree[],int n,int i) //使其符合parent>c1,c2
{
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if(i >= n)
{
return;
}
if(c1 < n && tree[c1] > tree[max])
{
max = c1;
}
if(c2 < n && tree[c2] > tree[max])
{
max = c2;
}
if(max != i)
{
swap1(tree,max,i);
heapify(tree,n,max);
}
}
void build_heap(int tree[],int n) //建堆
{
int last_node = n - 1;
int parent = (last_node - 1) / 2;
int i;
for(i = parent; i >= 0;i--)
{
heapify(tree,n,i);
}
}
void heap_sort(int tree[],int n) //堆排序
{
build_heap(tree,n);
int i;
for(i=n-1;i >= 0;i--)
{
swap1(tree,i,0);
heapify(tree,i,0);
}
}
int main()
{
int tree[]={2,5,3,1,10,4};
int n = 6;
int i;
heap_sort(tree,n);
//heapify(tree,n,0); //对这个杂乱数组,变成堆
for( i = 0;i < n;i++)
{
printf("%d ",tree[i]);
}
return 0;
}
谢谢同学们的阅读!!!