标签:堆排序
#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;
}
标签:堆排序
原文地址:http://blog.csdn.net/paulery2012/article/details/39700397