堆排序:1、首先从最后一个父节点开始调整,保证父节点大于孩子节点。
2、建堆结束后,将第一个元素和最后一个元素进行交换,这样堆结构发生变化,继续进行堆调整。
void *swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void heap_ajust(int *arr,int start,int end)
{
int dad=start;
int son=2*dad+1;
while(son<=end)
{
if(arr[son]<arr[son+1]&&son+1<end)
{
son++;
}
if(arr[son]<arr[dad])
{
return;
}
else
{
swap(&arr[son],$arr[dad]);
dad=son;
son=2*dad+1;
}
}
}
void heap_sort(int *arr,int n)
{
//建堆,从最后一个父节点开始
for(int i=len/2-1;i>0;i++)
{
heap_ajust(arr,i,n);
}
for(int i=0;i<n-1;i++)
{
//将第一个数和最后一个数据进行交换
swap(&arr[0],&arr[n-1]);
heap_ajust(arr,0,n-1);
}
}