本文共 977 字,大约阅读时间需要 3 分钟。
void heapSort(int array[], int n)
{ int i; for (i=n/2;i>0;i--)
{
HeapAdjust(array,i,n);
}
for( i=n;i>1;i--) {
swap(array, 1, i);
HeapAdjust(array, 1, i-1);
}
}
void HeapAdjust
(int array[], int s, int n )
{
int i,temp;
temp = array[s];
for(i=2*s;i<=n;i*=2)
{
if(i<n&&array[i]<array[i+1])
{
i++;
}
if(temp>=array[i])
{
break;
}
array[s]=array[i];
s=i;
}
array[s]=temp;
} void swap
(int array[], int i, int j)
{ int temp;
temp=array[i];
array[i]=array[j];
array[j]=temp; }
原文:https://blog.csdn.net/yushiyi6453/article/details/76407640for循环中只会调整某一结点跟他的左右子节点的顺序,以及由于该节点跟左右子节点的移动,导致以该左右子节点为根节点的子树大小发生变化,要一并进行调整。
那么每一层中的其他节点的调整是由HeapAdjust(array, 1, i-1);这个for循环进行判断的。
heapsort中的for循环只管某一个节点跟它的左右子节点的交换,以及该交换带来的效应,继续进行交换。
第一个判断条件:i<n是想判断下该节点有左节点,是否还有右节点。
第二个判断条件:通过第一个判断条件,此时i指向的是最大的那个节点,因为如果有有节点,且有节点较大,那么i++就代表有节点,如果没有或者左节点较大,那么i就为左节点,而如果temp比这个节点值要大,那么直接break
退出整个循环即可。通过另外的HeapAdjust(array, 1, i-1);循环去判断其他的节点跟他的左右子节点以及调整带来的效应。
第二遍的for循环通过s=i;
去判断该节点的下一个节点是否需要调整,如果需要就继续运行for循环。