void AdjustDown1(int* b, int n, int i) //向下調整,建立大堆
{
int parent = i;
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1 < n&&b[child + 1] > b[child])
{
++child;
}
if (b[child]>b[parent])
{
swap(b[child], b[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
int b[] = { 10, 11, 1, 2, 3, 85, 96, 4, 23, 52 };
void SortHeap(int* b, size_t n)//堆排序 升序 --》建立大堆
{
for (int i = (n - 2) >> 2; i >= 0; --i)//建堆
{
AdjustDown1(b, n, i);
}
int end = n - 1; //end 爲最後一個數的下標
while (end) //不斷的取堆頂最大的數放到後面,--end,調整堆。
{
swap(b[0], b[end]);
AdjustDown1(b, end,0);
--end;
}
for (int i = 0; i < n; ++i)
{
cout << b[i] << " ";
}
cout << endl;
堆的應用之堆排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.