您的位置:首页 > 其它

堆排序

2015-08-22 16:05 267 查看
首先将存放在L[1...n]中的那个元素建成初始堆,由于堆本身的特点,堆顶元素就是最大值。输出堆顶元素后,通常将堆底元素送入堆顶,此时根节点已不满足大顶堆的性质,将堆顶元素向下调整使其继续保持大顶堆的性质,再输出堆顶元素,直到堆中只剩下一个元素为止。
void AdjustDown(ElemType A[], int k, int len)

{

//函数AdjustDown是将元素i向下进行调整

A[0]=A[k];//A[0]暂存

for(i=2*k; i<len; i*=2)//沿key较大的子节点向下进行筛选

{

if(i<len && A[i]<A[i+1])

i++;//获取key叫到的子节点的下标


if(A[0]>=A[i])

{

	break;//筛选结束

}else{

	A[k]=A[i];//将A[i]调整到双亲节点上

	k=i;//修改k值,以便继续向下筛选

}

}

A[k]=A[0];//被筛选的值存放到最终的位置

}


void BuildMaxHeap(ElemType A[], int len)

{

for(int i=len/2; i>0; i--)//从i[n/2]~1,反复调整堆

{

AdjustDown(A, i, len);

}

}


void HeapSort(ElemType A[], int len)

{

BuildMaxHeap(A, len);//初始建堆

for(i=len; i>1; i--)//n-1趟的交换和建堆过程

{

Swap(A[i], A[1]);//输出堆顶的元素(和堆低元素进行交换)

AdjustDown(A, 1, i-1);//整理把剩余的i-1个元素整理成堆

}

}

[/code]时间复杂度:o(nlog2n)(以2为底的对数,2不会写成下标的形式)不稳定排序

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: