深入浅出理解排序算法之-堆排序
#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,constchar * 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");
return0;
}
posted on 2017-04-24 20:41 cynchanpin 阅读(216) 评论(0) 编辑 收藏 举报