堆排序算法
2011-12-14 23:05
141 查看
堆排序是利用堆进行排序的算法
将待排序的序列构造成一个大顶堆(或小顶堆),此时序列 的最大值就是堆顶的根结点
将其与堆数组中的未尾元素交换,此时未尾元素就是最大 值,然后将剩余的n - 1个序列重新构造成一个大顶堆,如些反复便能得到一个有序的序列
测试代码:
将待排序的序列构造成一个大顶堆(或小顶堆),此时序列 的最大值就是堆顶的根结点
将其与堆数组中的未尾元素交换,此时未尾元素就是最大 值,然后将剩余的n - 1个序列重新构造成一个大顶堆,如些反复便能得到一个有序的序列
#ifndef HEAPSORT_H #define HEAPSORT_H template<class T> void HeapAdjust(T *a,int n,int len) //建立大顶堆 { T temp = a ; for(int j = n * 2;j < len;j *= 2) { if(j < len - 1 && a[j] < a[j + 1]) //如果结点的左孩子小于右孩子增加j的值 ++j; //用于记录较大的结点的下标 if(temp >= a[j]) //如果父结点大于等于两个孩子,则满足大顶堆的定义,跳出循环 break; a = a[j]; //否则用较大的结点替换父结点 n = j; //记录下替换父结点的结点下标 } a = temp; //把原来的父结点移动到替换父结点的结点位置 } template<class T> void Swap(T *a,T *b) //交换两个数值 { T temp = *a; *a = *b; *b = temp; } template<class T> void HeapSort(T *a,int len) //堆排序算法 { for(int i = len / 2;i >= 0;--i) //建立大顶堆 HeapAdjust(a,i,len); for(int i = len - 1;i > 0;--i) { Swap(&a[i],&a[0]); //第个元素和最后一个元素进行交换 HeapAdjust(a,0,i); //建立大顶堆 } } #endif //HEAPSORT_H
测试代码:
#include "HeapSort.h" #include <stdio.h> int main() { int a[] = {12,45,34,37,66,15,6,4,17,19,25,35,3,2,1}; int len = sizeof(a) / sizeof(*a); HeapSort(a,len); printf("排序后的数组序列为:\n"); for(int i = 0;i < len;++i) printf("%d ",a[i]); printf("\n"); return 0; }