堆排序算法

简介: 堆排序算法

我们之前学了堆:

数据结构---堆-CSDN博客

数据结构:堆的实现-CSDN博客

我们知道堆有小堆和大堆之分,根节点不是最小就是最大的,我们可以利用这个特点实现堆排序

思路:

为什么我们要选择堆排序

它的效率相比于冒泡排序要高出不少

1.交换函数

2.向上调整

大堆向上调整,找大的往根节点排,找小的往叶子节点排

所以对比孩子节点和父亲节点,如果孩子节点大于父亲节点,则交换两个节点,然后child走到parent,parent走到(child-1)/ 2

3.向下调整

这就是堆的删除思路,根节点是最大的值,根节点和最后一个叶子节点交换,size--,然后继续大堆排序

4.堆排序

4.1建堆

建大堆,从数组第一个值 a[0] 开始插入建堆

4.2选数排序

就是堆的访问,用while循环控制

5.总代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void Swap(int* p1, int* p2);
void AdjustUp(int* a, int child);
void AdjustDown(int* a, int size, int parent);
void Swap(int* p1, int* p2)
{
  int tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
}
void AdjustUp(int* a, int child)
{
  int parent = (child - 1) / 2;
  while (child > 0)
  {
    if (a[child] > a[parent])
    {
      Swap(&a[child], &a[parent]);
      child = parent;
      parent = (child - 1) / 2;
    }
    else
      break;
  }
}
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 = parent * 2 + 1;
    }
    else
      break;
  }
}
void HeapSort(int* a, int n)
{
  //建堆
  for (int i = 1; i < n; i++)
  {
    AdjustUp(a, i);
  }
  //排序
  int end = n - 1;
  while (end > 0)
  {
    Swap(&a[0], &a[end]);
    AdjustDown(a, end, 0);
    --end;
  }
}
int main()
{
  int a[] = { 4,6,2,1,5,8,2,9 };
  int sz = sizeof(a) / sizeof(a[0]);
  HeapSort(a, sz);
  for (int i = 0; i < sz; i++)
  {
    printf("%d ", a[i]);
  }
  printf("\n");
  return 0;
}
相关文章
|
22小时前
|
机器学习/深度学习 人工智能 算法
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题
数据结构与算法:堆排序和TOP-K问题
|
22小时前
|
存储 人工智能 算法
深入浅出堆排序: 高效算法背后的原理与性能
深入浅出堆排序: 高效算法背后的原理与性能
50 1
|
22小时前
|
移动开发 算法 前端开发
前端算法之堆排序
前端算法之堆排序
14 1
|
22小时前
|
人工智能 搜索推荐 算法
sort-04-heap sort 堆排序算法详解
这是一个关于排序算法的系列文章摘要,包括了10篇关于不同排序算法的链接,如冒泡排序、快速排序、选择排序、堆排序等。堆排序是一种基于比较的排序算法,利用了近似完全二叉树的结构并满足最大堆或最小堆的性质。最大堆中,每个节点的值都大于或等于其子节点。文章详细解释了最大堆的概念、节点访问方式以及堆的操作,包括堆调整和堆排序的过程,并通过图解展示了堆排序的具体步骤。此外,还提供了一个Java实现的堆排序代码示例。整个排序系列来源于一个开源项目,读者可以通过链接查看完整内容。
sort-04-heap sort 堆排序算法详解
|
22小时前
|
算法
堆排序+TopK问题——“数据结构与算法”
堆排序+TopK问题——“数据结构与算法”
|
22小时前
|
算法 搜索推荐 数据挖掘
【算法与数据结构】堆排序&&TOP-K问题
【算法与数据结构】堆排序&&TOP-K问题
|
22小时前
|
搜索推荐 算法
【八大经典排序算法】堆排序
【八大经典排序算法】堆排序
13 0
|
22小时前
|
搜索推荐 算法
【排序算法】堆排序详解与实现
【排序算法】堆排序详解与实现
|
22小时前
|
搜索推荐 C语言
排序算法-选择/堆排序(C语言)
排序算法-选择/堆排序(C语言)
13 0
|
22小时前
|
搜索推荐 算法 Java
【数据结构排序算法篇】----堆排序【实战演练】
【数据结构排序算法篇】----堆排序【实战演练】
25 2

热门文章

最新文章