排序算法之堆排序
2015-04-13 15:31
120 查看
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
简单来说,就是利用二叉树,
1.建最大保持待排序区的最大数据永远是根节点,
2.将根节点与最后一个叶子节点互换位置.二叉树节点数减一.
3.因为新换上来的根节点不一定满足"最大"这个条件.所以要重新建堆.
4.重复步骤1-4.一直到二叉树大小为0.
简单来说,就是利用二叉树,
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); } }
相关文章推荐
- 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
- 排序算法-快速排序和堆排序
- 经典排序算法学习笔记七——堆排序
- 【排序】用Python实现八大排序算法--堆排序
- 堆排序----(排序算法六)
- 排序算法(六):堆排序
- 排序算法之堆排序
- 对常见排序算法的总结(选择、插入、希尔、归并、快速、堆排序)
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- 经典排序算法2-堆排序及优先队列
- 排序算法——堆排序
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序算法总结之堆排序
- 排序算法04:堆排序
- 【数据结构】排序算法:希尔、归并、快速、堆排序
- 排序算法之堆排序
- 排序算法——堆排序
- 排序算法之二 堆排序
- 排序算法_3,堆排序2
- 排序算法(3)—优先队列,堆排序