排序算法之堆排序
2011-05-12 22:45
134 查看
参考资料:http://www.7747.net/kf/201104/88993.html 《大话数据结构》第9章 排序 9.7 堆排序
以上页面非常详细以源码+图示的方法讲述了堆排序的全部过程,在此记录,仅为个人学习笔记。
堆排序的基本思想为:将待排序的序列构造成大顶堆(大顶堆:非叶子节点的儿子均小于父亲节点的完全二叉树(完全二叉树,最底一层不必满,不是满二叉树)),该堆的根节点为最大元素,将此元素取出,然后将最后一个元素换至根节点处,再次构造大顶堆,循环至所有元素取出。堆排序的的算法复杂度为O(nlogn)。
堆排序实现过程中的关键有两点:
1、如何将无序序列建立成大顶堆
首先将无序序列按照原先顺序放入完全二叉树中,然后用HeapAdjust()函数对其进行大顶化。
2、当输出堆顶元素后,如何将剩余元素形成新的大顶堆
当最后一个元素移至堆顶后,即可用HeapAdjust()对其大顶化。
代码如下:
//SqList为存储无序序列的队列
void HeapSort(SqList *L)
{
int i;
for(i = L->length/2; i > 0; i--)
{
//L为存储大顶堆的数组,i为起始节点,L->length为最后的节点
HeapAdjust(L, i, L->length);
}
for(i = L->length; i > 1; i--)
{
swap(L, 1, i);
HeapAdjust(L, 1, i - 1);
}
}
void HeapAdjust(SqList *L, int s, int m)
{
int temp, j;
temp = L->r[s];
for(j = 2 * s; j <= m; j *= 2)
{
if(j < m && L->r[j] < L->r[j+1])
++j;
if(temp >= L->r[j])
break;
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;
}
void swap(SqList *L, int s, int m)
{
printf("%d/n", L->r[s]);
L->r[s] = L->r[m];
}
以上页面非常详细以源码+图示的方法讲述了堆排序的全部过程,在此记录,仅为个人学习笔记。
堆排序的基本思想为:将待排序的序列构造成大顶堆(大顶堆:非叶子节点的儿子均小于父亲节点的完全二叉树(完全二叉树,最底一层不必满,不是满二叉树)),该堆的根节点为最大元素,将此元素取出,然后将最后一个元素换至根节点处,再次构造大顶堆,循环至所有元素取出。堆排序的的算法复杂度为O(nlogn)。
堆排序实现过程中的关键有两点:
1、如何将无序序列建立成大顶堆
首先将无序序列按照原先顺序放入完全二叉树中,然后用HeapAdjust()函数对其进行大顶化。
2、当输出堆顶元素后,如何将剩余元素形成新的大顶堆
当最后一个元素移至堆顶后,即可用HeapAdjust()对其大顶化。
代码如下:
//SqList为存储无序序列的队列
void HeapSort(SqList *L)
{
int i;
for(i = L->length/2; i > 0; i--)
{
//L为存储大顶堆的数组,i为起始节点,L->length为最后的节点
HeapAdjust(L, i, L->length);
}
for(i = L->length; i > 1; i--)
{
swap(L, 1, i);
HeapAdjust(L, 1, i - 1);
}
}
void HeapAdjust(SqList *L, int s, int m)
{
int temp, j;
temp = L->r[s];
for(j = 2 * s; j <= m; j *= 2)
{
if(j < m && L->r[j] < L->r[j+1])
++j;
if(temp >= L->r[j])
break;
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;
}
void swap(SqList *L, int s, int m)
{
printf("%d/n", L->r[s]);
L->r[s] = L->r[m];
}
相关文章推荐
- 常见排序算法的实现(三)——堆排序
- 排序算法(七)——堆排序
- 04_程序员必须掌握的8大排序算法_堆排序
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 排序算法——堆排序 (转)
- 五种经典排序算法的实现(冒泡、归并、快排、堆排序、希尔)
- 排序算法之堆排序(Heapsort)解析
- 排序算法之堆排序
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 三种排序算法(归并排序、快速排序,堆排序)
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 排序算法-------堆排序(大根堆)
- 排序算法之---堆排序
- 一步一步解析java排序算法--堆排序(最小堆)
- 各类排序算法-堆排序
- 排序算法(3)—优先队列,堆排序
- 排序算法(堆排序,归并排序,快速排序、选择排序、直接插入排序)
- 排序算法——堆排序
- 排序算法(四)堆排序
- 排序算法之堆排序