算法思想
- 将待排序的序列构成一个大顶堆(或小顶堆)
- 此时,整个序列的最大值就是堆顶的根节点。将它移走(就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值)
- 然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的最大最大值
代码实现
void HeapAdjust(int k[], int s, int n){
int i, temp;
temp = k[s];
for(i = 2 * s; i <= n; i *= 2){
if(i < n && k[i] < k[i+1]){
i++;
}
if(temp > k[i])
break;
swap(k, s, i)
s = i
}
k[s] = temp;
}
void swap(int k[], int i, int j){
int temp;
temp = k[i];
k[i] = k[j];
k[j] = temp;
}
void HeapSort(int k[], int n){
int i;
for(i = n/2; i > 0; i--){
HeapAdjust(k, i, n);
}
for(i = n; i > 1; i--){
swap(k, 1, i);
HeapAdjust(k, 1, i - 1);
}
}