排序算法之堆排序

来源:互联网 发布:达内大数据培训靠谱吗 编辑:程序博客网 时间:2024/05/21 19:49

堆排序(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);}}


0 0
原创粉丝点击