堆排序,是一种不稳定的排序方法,包含两个过程,构建堆和调整堆
构建堆的过程,要从下往上,从右往左;从有孩子的左节点开始往上调整。
构建完成后,交换堆顶元素和堆尾元素,然后对剩余元素重新调整成堆
时间复杂度:
整个堆的构建为O(n)
重建堆的时间复杂度为O(nlogn)
总体来说,堆排序的时间复杂度为O(nlogn)
int num[7] = {2, 3, 4, 5, 2, 3, 1};
int length = 7;
void heapSort(int* num, int len)
{
for(int i = len/2-1; i >= 0; i--) //由二叉树性质,知道len/2是最后一个包含孩子的节点
heapAdjust(num, i, len);
for(int i = len-1; i > 0; i--)
{
swap(num, 0, i);
heapAdjustnum, 0, i); //对剩余的[0,i]区间内的元素调整成堆
}
}
void heapAdjust(int* num, int low, int high)
{
int tempnum[low];
for(int j = low*2+1; j < high; j = j*2+1)
{
if(j+1 < high && num[j] < num[j+1)
++j;
if(temp >= num[j])
break;
num[low] = num[j];
low = j;
}
num[low] = temp;
}