您的位置:首页 > 其它

排序算法之堆排序

2015-04-13 15:31 120 查看
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

简单来说,就是利用二叉树,

1.建最大保持待排序区的最大数据永远是根节点,

2.将根节点与最后一个叶子节点互换位置.二叉树节点数减一.

3.因为新换上来的根节点不一定满足"最大"这个条件.所以要重新建堆.

4.重复步骤1-4.一直到二叉树大小为0.

struct Date
{
int date[100];
int size;
};

//建最大根堆
void max_heapify(Date *pDate,int a){

int largest;
int left = a*2;
int right =left+1;
if(left>pDate->size && right>pDate->size) return;
if (left <= pDate->size) largest = pDate->date[a]>pDate->date[a*2]?a:left;
if (right <= pDate->size) largest = pDate->date[largest]>pDate->date[a*2+1]?largest:right;
if (largest != a){
int temp;
temp = pDate->date[a];
pDate->date[a] = pDate->date[largest];
pDate->date[largest] = temp;
max_heapify(pDate,largest);
}
else 		return;
}

//建堆
void build_max_heap(Date *pDate)
{
int size = pDate->size;
int i = size/2;
while (i)
{
max_heapify(pDate,i);
size -= 2;
i =size/2;
}
}

//排序
void heapsort(Date *pDate)
{
int temp;
build_max_heap(pDate);
for (int i = pDate->size; i > 0; i--)
{
temp = pDate->date[i];
pDate->date[i] = pDate->date[1];
pDate->date[1] = temp;
pDate->size--;
max_heapify(pDate,1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: