#include<stdio.h>
//调整堆
void Swap(int *a, int pos1, int pos2);
void HeapAdjust(int *a, int i, int size)
{
int lchild = LeftChild(i);
int rchild = RightChild(i);
int largest = i;
if(lchild < size && a[lchild] > a[largest])
{
largest = lchild;
}
else
{
largest = i;
}
if(rchild < size && a[rchild] > a[largest])
{
largest = rchild;
}
if(largest != i)
{
Swap(a, i, largest);//交换
HeapAdjust(a,largest,size);
}
}
int LeftChild(int pos)
{
return pos * 2 + 1;
}
int RightChild(int pos)
{
return pos * 2 + 2;
}
void Swap(int *a, int pos1, int pos2)
{
int tmp = a[pos1];
a[pos1] = a[pos2];
a[pos2] = tmp;
}
//建立并调整堆
void Build_Max_Heap(int *a, int size)
{
int i;
for(i = (size / 2); i >= 0; i--)
{
HeapAdjust(a,i,size);
}
}
void Heap_Sort(int *a, int size)
{
Build_Max_Heap(a,size);
int length = size;
int i;
for(i = length - 1; i >= 1; i--)
{
Swap(a, 0, i);
size = size - 1;
HeapAdjust(a,0,size);
}
}
void main(void)
{
int a[] = {2,6,9,1,0,5,3,4,7,8};
int size = 10;
Heap_Sort(a,size);
int i;
for(i = 0; i < size; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
该算法用最大堆排序算法对数据进行排序,主要的步骤是1、建立堆 2、调整堆中数据的位置.
堆排序算法的实现
最新推荐文章于 2023-11-26 11:03:09 发布