堆排序算法

简介: 堆排序算法



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

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)

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

目录
相关文章
|
6月前
|
算法 Python
数据结构算法--4堆排序
堆排序过程概述:建立大根堆,将堆顶最大元素移出并替换为末尾元素,调整保持堆性质,重复此过程直至堆为空,实现排序。时间复杂度为O(nlogn)。Python中可用heapq模块进行堆操作。
|
7月前
|
机器学习/深度学习 人工智能 算法
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题
数据结构与算法:堆排序和TOP-K问题
|
7月前
|
存储 人工智能 算法
深入浅出堆排序: 高效算法背后的原理与性能
深入浅出堆排序: 高效算法背后的原理与性能
128 1
|
2月前
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
85 0
数据结构与算法学习十八:堆排序
|
2月前
|
算法 搜索推荐
算法之堆排序
本文介绍了堆排序算法的原理和实现,通过构建最大堆或最小堆,利用堆的性质进行高效的排序,并提供了具体的编程实现细节和示例。
33 0
算法之堆排序
|
2月前
|
算法 Java Go
深入了解堆排序算法
深入了解堆排序算法
43 1
|
7月前
|
移动开发 算法 前端开发
前端算法之堆排序
前端算法之堆排序
44 1
|
6月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
53 3
|
6月前
|
搜索推荐 算法
【C/排序算法】:堆排序和选择排序
【C/排序算法】:堆排序和选择排序
42 0
|
6月前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
42 0

热门文章

最新文章