堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
简单来说,就是利用二叉树,
1.建最大保持待排序区的最大数据永远是根节点,
2.将根节点与最后一个叶子节点互换位置.二叉树节点数减一.
3.因为新换上来的根节点不一定满足"最大"这个条件.所以要重新建堆.
4.重复步骤1-4.一直到二叉树大小为0.
struct Date { int date[100]; int size; }; //建最大根堆 void max_heapify(Date *pDate,int a){ int largest; int left = a*2; int right =left+1; if(left>pDate->size && right>pDate->size) return; if (left <= pDate->size) largest = pDate->date[a]>pDate->date[a*2]?a:left; if (right <= pDate->size) largest = pDate->date[largest]>pDate->date[a*2+1]?largest:right; if (largest != a){ int temp; temp = pDate->date[a]; pDate->date[a] = pDate->date[largest]; pDate->date[largest] = temp; max_heapify(pDate,largest); } else return; } //建堆 void build_max_heap(Date *pDate) { int size = pDate->size; int i = size/2; while (i) { max_heapify(pDate,i); size -= 2; i =size/2; } } //排序 void heapsort(Date *pDate) { int temp; build_max_heap(pDate); for (int i = pDate->size; i > 0; i--) { temp = pDate->date[i]; pDate->date[i] = pDate->date[1]; pDate->date[1] = temp; pDate->size--; max_heapify(pDate,1); } }