您的位置:首页 > 其它

堆排序算法_2011_10_10

2011-10-10 15:09 302 查看
//堆排序
voidadjustHeap(int R[], inti, int m)
{
int nTemp = R[i];
int j= (2 * i) + 1;//即使是根节点,那么左孩子的的序号为i+ 1,右孩子的序号为i +  2,这样就可以让r[0]也加入进来

while (j <= m)
{
if ((j< m)&& (R[j] < R[j + 1]))
{
j++;
}

if (nTemp < R[j])
{
R[i] = R[j];
i = j;//
j = (2 * i) + 1;//这里之所以要这么赋值是因为,当你根结点和子结点交换元素以后,那么子树可能就不是大根堆或者小根堆了,
//那么你就要跑回去检查看是否依然是大(小)根堆
}
else
{
break;
}

R[i] = nTemp;
}
}

voidheapSort(int r[],intn)
{
int nTemp = 0;

//之所以是n/2 – 1是因为不要浪费r[0]这个空间
for (inti = (n / 2) - 1; i >= 0; i--)
{
adjustHeap(r, i, n - 1);
}

for (inti = n - 1; i >= 0; i--)
{
nTemp = r[0];
r[0] = r[i];
r[i] = nTemp;

adjustHeap(r, 0, i - 1);
}

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