#include <iostream>
void Swap(int &a,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
// 维护最小堆
void AdjustMinHeap(int *a,int pos,int len){
int temp,child;
for (temp = a[pos];
2*pos + 1 <= len; pos = child) {
// 不断下移父结点,直到结束
// 左孩子(因为第一个结点是从0开始的)
child = 2*pos +
1;
if (child < len && a[child] > a[child +
1]) //
选取左右孩子中的最小值,a[pos]=temp父亲,a[child]左孩子,a[child+1]右孩子
child++;
if (temp > a[child]) {
// 如果父结点>最小值,将将父节点赋予最小值
a[pos] = a[child];
} else {
break;
}
}
a[pos] = temp;
}
/* 堆排序
基本思想:对于n个元素的序列进行堆排序,先将其建成堆(最小堆:上一层的比本层小,一次递推)。以根结点与第n个结点交换,调整前n-1个结点成为堆,再以根节点与第n-1个结点进行交换,重复上述操作,直到整个序列有序。
特点:时间复杂度:O(nlogn)
*/
void MyMinHeapSort(int *array,int len){
int i;
for (i = len/2-1; i >=
0;i--) //
先初建堆
AdjustMinHeap(array, i, len -
1);
for (i = len -
1; i >= 0; i--) {
Swap(array[i],array[0]);
// 取出堆顶元素(也就是最小元素array[0],放到数组第i位)
AdjustMinHeap(array,
0, i-1);
// 然后对前i-1位数组重建堆(重建后堆顶为最小元素)
}
}
int main(int argc,
const char * argv[])
{
int i;
int array[] = {0,13,1,14,27,18};
int length =
sizeof(array)/sizeof(array[0]);
// 堆排序
MyMinHeapSort(array, length);
for (i =
0; i < length; i++){
printf("%d ",array[i]);
}
printf("\n");
return
0;
}