堆排序
是一种不稳定的方法,时间复杂度为 O(nlog2 N)。
基本思想:
首先将待排序的记录序列构造成一个堆,此时,选出了对重所有记录的最大者即堆顶记录。然后将堆顶记录移走,并将剩余的记录在调整成堆,这样又找出了次大的记录。一次类推,直到堆中只有一个记录为止。
代码:
void Sift(int r[],int k,int m)//筛选法调整堆的算法
{
int i = k;
int j = 2 * i;
while (j <= m)
{
if (j < m && r[j] < r[j + 1])
{
j++;
}
if (r[i] < r[j])
{
break;
}
else
{
int nTemp = r[i];
r[i] = r[j];
r[j] = nTemp;
i = j;
j = 2 * i;
}
}
}
void HeapSort(int r[],int n)
{
int i;
for (i = n / 2; i >= 1; i--)
{
Sift(r, i, n);
}
for (i = 1; i < n;i++)
{
int nTemp = r[1];
r[1] = r[n - i + 1];
r[n - i + 1] = r[1];
Sift(r, 1, n - 1);
}
}