(排序详解之 堆排序)
2013-08-15 23:44
211 查看
堆排序
本文将介绍一下堆排序的过程。
要点:(最小堆为例)
1. 调整堆函数:传入节点索引,对比当前节点与父节点大小,如果小于则交换位置,以父节点位置递归执行。
2. 设index=Arr.Count/ 2 -1 ,取到index位置的子节点,将子节点和当前节点依次传入递归函数执行,i∈[0,index],i--循环执行
3. 每次移除根节点,执行1,2过程,直到数组中没有节点
详细过程:
还是以一个数组为开始:
5 , 1 ,9 ,3 ,7 ,4 ,8 ,6 ,2
我们开始建立堆(本文讨论二插堆),规则是这样的,从第一个元素开始,它的索引为I,那么2*i+1和2*i+2是它的后代
括号内为索引值:
堆建立好了,现在开始调整堆并排序。
第一步,从index= arr.Count/2 – 1 = 9/2-1 = 3开始,
第二步,index = 2
第三步,index = 1
Index = 0
,发现不用调整,第一轮执行完毕,因此移除第一项,对接下来的数组做同样的操作,在此就不一一演示了。
参考代码:
public List<int>HeapSort(List<int> arr)
{
var ret = new List<int>();
while (arr.Count > 0)
{
for (int i = arr.Count / 2 - 1;i >= 0; i--)
{
if (i > 0)
HeapMerge(arr, i);
HeapMerge(arr, i * 2 + 1);
if (i * 2 + 2 <=arr.Count - 1)
HeapMerge(arr, i * 2 +2);
}
ret.Add(arr[0]);
arr.RemoveAt(0);
}
return ret;
}
//construct heap
private void HeapMerge(List<int>arr,int index)
{
if (index > 0 &&arr[index] < arr[(index-1)/2])
{
var tmp = arr[index];
arr[index] = arr[(index-1)/2];
arr[(index-1)/2] = tmp;
HeapMerge(arr,(index-1)/2);
}
}
希望现在您已经很清楚二插堆和堆排序了。
感谢您的阅读。
相关文章推荐
- 【排序】插入排序,希尔排序,选择排序,冒泡排序,堆排序详解及稳定性分析
- 排序详解:堆排序
- 内部排序之堆排序的实现详解
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 简单选择排序,树形选择排序,堆排序详解
- 排序详解:堆排序
- 插入排序,希尔排序,堆排序详解
- 新手讲排序:堆排序 和 认识二叉堆
- Python 列表排序方法reverse、sort、sorted详解
- 八大排序方法详解(附java代码)
- 七种排序(直接插入、折半插入、希尔、起泡、快速、简单选择、堆排序)
- 堆排序 - 不稳定的排序
- [汇编版]冒泡排序、快速排序、堆排序
- 排序---堆排序
- 《大话数据结构》第9章 排序 9.7 堆排序(下)
- 常见的五类排序算法图解和实现(选择类:简单选择排序,锦标赛排序,树形选择排序,堆排序)
- 冒泡排序,选择排序,快速排序,堆排序与二分查找算法
- Java map 详解 - 用法、遍历、排序、常用API等
- java中Collections.sort排序详解