标签:堆排序 堆排序模板 堆排序原理 堆排序思想 堆排序实现
堆排序学习以及模板
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:
1、创建一个堆H[0..n-1](利用MaxHeapify函数从最后一个非叶子节点开始调整堆,如BuildMaxHeap函数调整为大根堆)。
2、把堆首(最大值)和堆尾互换(取堆顶元素,因为其总是当前堆中最大或者最小的)
3、把堆的尺寸缩小1,并调用MaxHeapify,目的是使堆顶元素仍然是堆中最大或者最小的(最大还是最小看是大根堆还是小根堆)。
4、重复步骤2,直到堆的尺寸为1
#include <stdio.h> #include <stdarg.h> int getParent(int i) { return (int)(i/2); } int getLeftSon(int i) { return (i*2); } int getRightSon(int i) { return (i*2 + 1); } void PrintHeap(int a[], int size,char *msg, ...) { int i; va_list ap; char buffer[1024]; va_start(ap, msg); //输出自定义内容 vsnprintf(buffer, 1024, msg, ap); va_end(ap); printf("%s",buffer); for(i=1; i<=size; i++) printf("%d ",a[i]); printf("\n"); } //调整以某个节点i为根节点的子树为大根堆 void MaxHeapify(int a[], int i, int HeapSize) { int left_son = getLeftSon(i); int right_son = getRightSon(i); int max_num = i; if(left_son <= HeapSize && a[left_son] > a[max_num] ) { max_num = left_son; } if(right_son <= HeapSize && a[right_son] > a[max_num]) //两步 找出最大的节点 { max_num = right_son; } if(max_num != i) { int temp = a[i]; a[i] = a[max_num]; a[max_num] = temp; MaxHeapify(a, max_num, HeapSize); } } //首先将一个无序数组 组建成为一个大根堆 void BuildMaxHeap(int a[], int size) { int i; for(i=(int)(size/2); i>0; i--) //从最后一个非叶子节点开始往前递归 { MaxHeapify(a, i, size); } PrintHeap(a, size, "Build a Big root Heap %d:",size); } //先建一个大根堆 然后从后往前取最大的数(根节点肯定是当前堆中最大的数 每次堆大小减一) void HeapSort(int a[], int size) { int i; BuildMaxHeap(a, size); for(i=size; i>1; i--) { int temp = a[i]; //获取当前堆中最大的数 a[i] = a[1]; a[1] = temp; MaxHeapify(a, 1, i-1); PrintHeap(a, i-1, "This is in Heap sorting:"); } } int main() { //从1开始 建堆 int Array[] = {0, 6, 8, 4, 10, 2, 5, 7, 1, 3, 9}; HeapSort(Array, 10); PrintHeap(Array, 10, "After Heap Sort, Array is:"); return 0; }
运行结果:
参考网址:
http://blog.csdn.net/zjf280441589/article/details/38589353
http://blog.csdn.net/xiajun07061225/article/details/7602979
标签:堆排序 堆排序模板 堆排序原理 堆排序思想 堆排序实现
原文地址:http://blog.csdn.net/a656343072/article/details/41284633