排序算法之堆排序

基本思想:

在堆排序的算法中先建一个大顶堆,既先选得一个关键字作为最大的记录并与序列中最后一个记录交换,然后对序列中前N-1记录进行选择,重新将它调整成一个大顶堆,如此反复直到排序结束。

 

#include <stdio.h>
const int Length = 10; //堆大小
void Max_Heapify(int [], int, int);
void Build_Max_Heap(int []);
void HeapSort(int [], int);
/*单一子节点最大堆调整*/
void Max_Heapify(int L[], int i, int length)
{
    int l = 2*i+1;/*根节点为0时,i的左子节点*/
    int r = 2*i+2;/*右子节点*/
    int largest;
    int temp;
    if(l < length && L[l] > L[i])
    {
        largest = l;
    }
    else 
    {
        largest = i;
    }
    if(r < length && L[r] > L[largest])
    {
        largest = r;
    }
    if(largest != i)
    {
        temp = L[i];
        L[i] = L[largest];
        L[largest] = temp;
        Max_Heapify(L, largest, length);//交换后的子节点比父节点小,
		//但不能保证交换过来的子节点比他的子节点小,所以要递归,使子节点为根的子树也是最大堆 
    }
}
/*建立初始最大堆*/
void Build_Max_Heap(int L[])
{
	int i,j;
    for(i = Length/2; i >= 0; i--)
    {
        Max_Heapify(L, i, Length);
        
    }
}
/*堆排序*/
void HeapSort(int L[], int length)
{
    int temp;
    int i;
    Build_Max_Heap(L);
    for(i = length - 1; i >= 1; i--)
    {
        temp = L[0];// 交换堆顶和堆尾,取得最大值 
        L[0] = L[i];
        L[i] = temp;
        length = length - 1;//整个数组元素个数减1 
        Max_Heapify(L, 0, length);//对新数组生成最大堆 
    }
    for(i = 0; i < Length;i++)
    {
        printf("%d ", L[i]);
    }
    printf("\n");
}
 
int main()
{
    int L[10]={4,9,2,6,0,8,3,7,5,1},i;
    HeapSort(L, Length);
    
    system("pause");
    return 0;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值