//堆排序
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);
}
}
堆排序算法_2011_10_10
最新推荐文章于 2024-05-16 23:45:01 发布