C语言 数据结构堆排序顺序存储(升序)

C语言 数据结构堆排序顺序存储(升序)攻略

1. 堆排序概述

堆排序是一种常见的排序算法,通过构建最大堆或最小堆来实现排序。本文介绍的是使用顺序存储方式实现的最大堆排序,也就是升序排序。

2. 最大堆的定义和实现

最大堆指的是堆结构中父节点的值大于子节点的值,根节点的值最大。对于一棵完全二叉树,若父节点的下标为i,则其左子节点的下标为2i+1,右子节点的下标为2i+2。下面是最大堆的实现代码:

void adjustHeap(int a[], int i, int n)
{
    int j, temp = a[i];
    for (j = 2 * i + 1; j < n; j = 2 * j + 1)
    {
        if (j < n - 1 && a[j] < a[j+1])
            ++j;

        if (temp >= a[j])
            break;

        a[i] = a[j];
        i = j;
    }
    a[i] = temp;
}

void buildHeap(int a[], int n)
{
    int i;
    for (i = n / 2 - 1; i >= 0; --i)
        adjustHeap(a, i, n);
}

其中,adjustHeap是调整堆的函数,用于将以i为父节点的子树调整为最大堆,n为数组大小;buildHeap是建堆函数,用于将整个数组调整为最大堆。

3. 堆排序的实现

堆排序的过程就是不断将堆顶元素(最大值)与堆底元素交换,再调整剩余元素为最大堆,以此类推,直到整个数组有序。堆排序的实现代码如下:

void heapSort(int a[], int n)
{
    int i, temp;
    buildHeap(a, n);
    for (i = n - 1; i > 0; --i)
    {
        temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        adjustHeap(a, 0, i);
    }
}

其中,buildHeap调整整个数组为最大堆,heapSort函数则用于完成整个堆排序的过程。

4. 示例说明

示例一

假设一个数组为{7, 3, 1, 5, 2, 4, 6},经过堆排序过程后,数组应该为{1, 2, 3, 4, 5, 6, 7},下面是详细的堆排序过程:

  1. 首先调整整个数组为最大堆,得到{7, 5, 4, 3, 2, 1, 6}
  2. 将堆顶元素7与堆底元素6交换,得到{6, 5, 4, 3, 2, 1, 7},此时下标为0~5的元素为最大堆
  3. 将堆顶元素6与堆底元素1交换,得到{1, 5, 4, 3, 2, 6, 7},此时下标为0~4的元素为最大堆
  4. 将堆顶元素1与堆底元素2交换,得到{2, 5, 4, 3, 1, 6, 7},此时下标为0~3的元素为最大堆
  5. 将堆顶元素2与堆底元素3交换,得到{3, 5, 4, 2, 1, 6, 7},此时下标为0~2的元素为最大堆
  6. 将堆顶元素3与堆底元素1交换,得到{1, 5, 4, 2, 3, 6, 7},此时下标为0~1的元素为最大堆
  7. 将堆顶元素1与堆底元素0交换,得到{1, 5, 4, 2, 3, 6, 7},此时整个数组有序

示例二

假设一个数组为{1, 2, 3, 4, 5, 6, 7},经过堆排序过程后,数组应该还是{1, 2, 3, 4, 5, 6, 7},因为数组已经有序,所以只需调用buildHeap函数构建最大堆即可。

5. 总结

堆排序是一种常见的排序算法,其时间复杂度为O(nlogn)。本文介绍了使用顺序存储方式实现的最大堆排序,包括最大堆的定义和实现,以及堆排序的具体实现过程和示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 数据结构堆排序顺序存储(升序) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • java实现数据结构单链表示例(java单链表)

    下面是 Java 实现数据结构单链表的完整攻略。 简介 单链表是数据结构中的一种,用于存储一组有序的元素。单链表中,每个元素都由一个结点表示,结点中包含了一个指向下一个结点的指针。单链表的结构更加灵活,支持插入、删除等操作。 实现步骤 1. 定义节点类ListNode 单链表的每一个节点包含两个属性,分别是节点值 val 和指向下一个节点的指针 next,所…

    数据结构 2023年5月17日
    00
  • C#数据结构之顺序表(SeqList)实例详解

    C#数据结构之顺序表(SeqList)实例详解 顺序表(SeqList)概述 顺序表(SeqList)是一种线性表存储结构,它的特点是元素的存储位置是连续的。因为它的存储结构是数组,所以在访问和修改元素时,可以通过数组下标进行快速定位。顺序表在内存中的存储相对紧凑,因此查找和修改效率都很高,适用于大多数元素较少、但是需要频繁访问的场景。 实现顺序表(SeqL…

    数据结构 2023年5月17日
    00
  • Java数据结构常见几大排序梳理

    Java数据结构常见几大排序梳理 在Java中,数据排序是非常常见的操作。下面我们详细讲解一下Java数据结构常见几大排序的梳理。 常见几大排序 Java数据结构中常见几种排序算法包括: 冒泡排序(Bubble Sort) 快速排序(Quick Sort) 插入排序(Insertion Sort) 选择排序(Selection Sort) 希尔排序(Shel…

    数据结构 2023年5月17日
    00
  • C++LeetCode数据结构基础详解

    C++LeetCode数据结构基础详解攻略 什么是LeetCode? LeetCode是一个专门为程序员提供的算法题平台。平台上汇集了各种算法、数据结构和编程题,用户可以在平台上挑战各种难度的算法用来提高自己的编程能力和算法素养。 如何学习LeetCode? 学习LeetCode的关键是掌握数据结构和算法。下面介绍如何结合具体的C++代码来学习LeetCod…

    数据结构 2023年5月17日
    00
  • Java数据结构专题解析之栈和队列的实现

    Java数据结构专题解析之栈和队列的实现 什么是栈和队列? 在计算机科学中,栈(Stack)和队列(Queue)都是常见的数据结构,用于解决许多问题。它们都是线性数据结构,但它们的元素访问顺序不同。 栈是先进后出(Last In First Out,LIFO)的结构,即最后放入栈中的元素最先被访问。 队列是先进先出(First In First Out,FI…

    数据结构 2023年5月17日
    00
  • 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前置:「学习笔记」字符串基础:Hash,KMP与Trie。 好像对例题的讲解越来越抽象了? 算法 问题 求 \(n\) 个单词在一个长度为 \(m\) 的文章里出…

    算法与数据结构 2023年5月5日
    00
  • python算法与数据结构朋友圈与水杯实验题分析实例

    让我来详细讲解一下“python算法与数据结构朋友圈与水杯实验题分析实例”的完整攻略。 1. 前言 本文将分享两个Python的算法与数据结构问题,即朋友圈和水杯实验题。我们将分别介绍问题的背景、解题思路和代码实现。 2. 朋友圈问题 2.1 背景 给定一个M*N的矩阵,矩阵中的每个元素都是1或0。如果矩阵中的1元素相邻,即水平、垂直或对角线相邻,则将这些元…

    数据结构 2023年5月17日
    00
  • golang优先级队列的实现全过程

    下面是关于”golang优先级队列的实现全过程”的详细讲解。 什么是优先级队列? 优先级队列是一种常用的数据结构,它可以帮我们按照一定规则(即优先级)将元素按照大小排序,并支持快速插入、删除和查询最大或最小的元素等操作。我们可以将优先级队列想象成一个具有优先级的、自动排序的队列,其中优先级高的元素(比如数字大的元素)排在前面,优先级低的元素(比如数字小的元素…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部