堆排序算法

简介: 堆排序算法



虽然在之前的【树】章节,我们已经学习了堆排序。但是这里我们任然要回顾并且补充一些堆排序算法点。

HeapSort堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。

  • 注意的是排升序要建大堆,排降序建小堆。

直接选择排序的特性总结:

1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N*logN)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

整体思路

  • 向下调整算法AdjustDown
  • 建堆(两种方式,主要以向下调整为重点❗)
  • 堆排序
  • 建大堆:升序
  • 建小堆:降序
  • 1:交换头尾
  • 2:向下调整(除去最后一个元素&&最后一个元素已经排好序了)
  • 3:循环重复上述过程,直到全部调整完成

图解分析

【1】向下调整算法

//向下调整
void Adjustdown(int * a, int size, int parent)
{
  //假设法
  int child = parent * 2 + 1;
  while (child < size )
  {
    if (child + 1 < size && a[child + 1] < a[child])//注意❗
    {
      child++;
    }
    //比较
    if (a[child] < a[parent])
    {
      //交换
      Swap(&a[child], &a[parent]);
      parent = child;
      child = child * 2 + 1;
    }
    else//>=
    {
      break;
    }
  }
}

【2】向下调整建堆

//向下调整建堆
  for (int i = (size - 1 - 1) / 2; i >= 0; i--)
  {
    Adjustdown(a, size, i);
  }

【3】排序

void HeapSort(int* a, int size)
{
  //1.向下调整建堆
  for (int i = (size - 1 - 1) / 2; i >= 0; i--)
  {
        //向下调整算法
    Adjustdown(a, size, i);
  }
  //2.排序
  while (size)
  {
    //交换
    Swap(&a[0], &a[size - 1]);
    //向下调整(除去已经排序好的元素)
    Adjustdown(a, size - 1, 0);
    //到达下一个交换的位置
    size--;
  }
}

时间复杂度

  • 建队的时间复杂度:O(N)/         O(N*logN)
  • 高度次:logN
  • 交换+向下调整(调整高度次):O(logN*N)=O(N*logN)
  • 堆排序的时间复杂度:O(N)+O(N*logN)=O(N*logN)
  • 堆排序的时间复杂度:O(N*logN)

🙂感谢大家的阅读,若有错误和不足,欢迎指正。下篇快速排序算法。

目录
相关文章
|
3月前
|
算法 Python
数据结构算法--4堆排序
堆排序过程概述:建立大根堆,将堆顶最大元素移出并替换为末尾元素,调整保持堆性质,重复此过程直至堆为空,实现排序。时间复杂度为O(nlogn)。Python中可用heapq模块进行堆操作。
|
4月前
|
机器学习/深度学习 人工智能 算法
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题
数据结构与算法:堆排序和TOP-K问题
|
4月前
|
存储 人工智能 算法
深入浅出堆排序: 高效算法背后的原理与性能
深入浅出堆排序: 高效算法背后的原理与性能
92 1
|
4月前
|
移动开发 算法 前端开发
前端算法之堆排序
前端算法之堆排序
32 1
|
3月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
35 3
|
3月前
|
搜索推荐 算法
【C/排序算法】:堆排序和选择排序
【C/排序算法】:堆排序和选择排序
24 0
|
3月前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
29 0
|
4月前
|
人工智能 搜索推荐 算法
sort-04-heap sort 堆排序算法详解
这是一个关于排序算法的系列文章摘要,包括了10篇关于不同排序算法的链接,如冒泡排序、快速排序、选择排序、堆排序等。堆排序是一种基于比较的排序算法,利用了近似完全二叉树的结构并满足最大堆或最小堆的性质。最大堆中,每个节点的值都大于或等于其子节点。文章详细解释了最大堆的概念、节点访问方式以及堆的操作,包括堆调整和堆排序的过程,并通过图解展示了堆排序的具体步骤。此外,还提供了一个Java实现的堆排序代码示例。整个排序系列来源于一个开源项目,读者可以通过链接查看完整内容。
sort-04-heap sort 堆排序算法详解
|
4月前
|
算法 搜索推荐
数据结构与算法⑫(第四章_中_续一)堆排序(详解)
数据结构与算法⑫(第四章_中_续一)堆排序(详解)
38 0
|
4月前
|
人工智能 算法 搜索推荐
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”