void Sift(int R[], int low, int high)
{
int i = low, j = 2 * i + 1; //R[j]是R[i]的左孩子
int temp = R[i];
while (j <= high)
{
if (j < high && R[j] < R[j + 1]) //若右孩子较大,则把j指向右孩子
j++;
if (temp < R[j])
{
R[i] = R[j]; //将R[i]调整到双亲位置上
i = j; //修改i和j的值,以便继续向下调整
j = 2 * i + 1;
}
else
{
break; //调整结束
}
}
R[i] = temp;
}
void heapSort(int R[], int n)
{
int i, temp;
for (i = n / 2 - 1; i >= 0; i++) //将i定位到最后一个非叶子结点
Sift(R, i, n); //建立初始堆
for (i = n - 1; i > 0; i--)
{
temp = R[0];
R[0] = R[i];
R[i] = temp;
Sift(R, 0, i - 1); //在减少了一个关键字的无序序列中进行调整
}
}
堆排序的简单C语言实现
于 2020-08-16 15:07:56 首次发布