您的位置:首页 > 其它

排序-堆排序

2016-04-05 20:22 204 查看
堆排序

基本思想:就是先构建一次大顶堆,通过树来将最大的数放在树根,然后与最后一个节点交换位置,最后将除去最后一个最大的元素之外的所有元素重新构建大顶堆。

代码:

//构建大顶堆
void HeapAdjust(int* L, int s, int length)
{
int i;
int temp = L[s];//内部节点
for (i = 2 * s; i <= length; i *= 2)
{
if (i < length && L[i] < L[i + 1])//找到最大的叶子节点的下标 i代表左节点下标,i + 1代表右节点下标
{
i++;
}
if (temp >= L[i])//内部节点大于叶子节点就不用构建大顶堆了
{
break;
}
L[s] = L[i];//否则将内部节点s赋值为最大的叶子节点的值
s = i;//s改为存储叶子节点下标
}
L[s] = temp;//叶子节点被赋值为起初的内部节点,即实现了内部节点和最大的叶子节点的交换
}

//堆排序
void HeapSort(int* L, int length)
{
int i;
for (i = length / 2; i >= 0; i--)//数组包含0,所以循环到0
{
HeapAdjust(L, i, length);//调整成大顶堆
}

for (i = length - 1; i > 0; i--)//循环到i = 1结束,因为i - 1 > 0
{
myswap(L, 0, i);//交换顶堆元素和最后一个元素
HeapAdjust(L, 0, i - 1);//将剩下的 0 - length - 1调整成大顶堆
}
}


main测试

int main(void)
{
int x[10] = { 50, 10, 90, 30, 70 , 40, 80, 60, 20, 100};
showArray(x, 10);//显示数组元素
HeapSort2(x, 10);
printf("\n");
showArray(x, 10);
system("pause");
return 0;
}


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