堆 && 堆排序

堆排序(Heapsort)是指利用这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。


分类排序算法
数据结构数组
最差时间复杂度O(nlogn)
最优时间复杂度O(nlogn)[1]
平均时间复杂度\Theta(nlog n)
最差空间复杂度O(n) total, O(1)auxiliary

//http://blog.csdn.net/morewindows/article/details/6709644
/*
一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。
*/

//  新加入i结点  其父结点为(i - 1) / 2  
void MinHeapFixup(int a[], int i)  
{  
    int j, temp;  
      
    temp = a[i];  
    j = (i - 1) / 2;      //父结点  
    while (j >= 0 && i != 0)  
    {  
        if (a[j] <= temp)  
            break;  
          
        a[i] = a[j];     //把较大的子结点往下移动,替换它的子结点  
        i = j;  
        j = (i - 1) / 2;  
    }  
    a[i] = temp;  
}  

//在最小堆中加入新的数据nNum  
void MinHeapAddNumber(int a[], int n, int nNum)  
{  
    a[n] = nNum;  
    MinHeapFixup(a, n);  
}  

//在最小堆中删除

void MinHeapFixDown(int a[], int i , int n)
{
	int j,temp;
	
	j = i * 2 + 1;
	temp = a[i];
	
	while( j < n )
	{
		if( j+1<n && a[j+1]<a[j]) //在左右孩子中找最小的  
			++j;
		if(a[j] >= temp)
			break;
		
		a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点  
		i = j;
		j = i*2+1;
	}
	a[i] = temp;
}
//在最小堆中删除数  
void MinHeapDeleteNumber(int a[], int n)  
{  
    Swap(a[0], a[n - 1]);  
    MinHeapFixdown(a, 0, n - 1);  
}  

/* 建堆方法,只需线性时间建好;
建堆的结果:数组的第一个元素(即树根)是所有元素中的最小值,索引小于等于size/2-1的其它元(即其它非叶子节点)的值都是其所在子树的最小值 */ 
//建立最小堆  
void MakeMinHeap(int a[], int n)  
{  
    for (int i = n / 2 - 1; i >= 0; i--)  
        MinHeapFixdown(a, i, n);  
}  

//堆排序
//具体流程:建堆--》堆排序
void MinheapsortTodescendarray(int a[], int n)  
{  

	for (int i = n / 2 - 1; i >= 0; i--)  
        MinHeapFixdown(a, i, n); 
		
    for (int i = n - 1; i >= 1; i--)  
    {  
        Swap(a[i], a[0]);  
        MinHeapFixdown(a, 0, i);  
    }  
}  





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值