C语言植物大战数据结构快速排序图文示例

C语言植物大战数据结构的快速排序可以分为以下步骤:

准备工作

首先需要定义一个关于植物大战中植物的结构体,例如:

struct Plant {
    int hp;
    int atk;
    int cost;
};

然后准备一个装载植物信息的数组:

struct Plant plants[] = {
    {75, 36, 100},
    {100, 20, 50},
    {125, 24, 125},
    {150, 40, 175},
    {175, 60, 250},
    {200, 80, 325},
};

快速排序实现

接下来进行快速排序的具体实现,我们的排序目标是按照植物的攻击力(atk)进行升序排序。排序函数如下:

void quicksort(struct Plant *plants[], int left, int right) {
    if (left < right) {
        int i = left;
        int j = right + 1;
        struct Plant *pivot = plants[left];
        while (1) {
            while (plants[++i]->atk < pivot->atk) {
                if (i == right) {
                    break;
                }
            }
            while (plants[--j]->atk > pivot->atk) {
                if (j == left) {
                    break;
                }
            }
            if (i >= j) {
                break;
            }
            struct Plant *temp = plants[i];
            plants[i] = plants[j];
            plants[j] = temp;
        }
        plants[left] = plants[j];
        plants[j] = pivot;
        quicksort(plants, left, j - 1);
        quicksort(plants, j + 1, right);
    }
}

这个函数接收一个装载了植物信息的数组 plants 的指针的指针,因为我们要在数组内部进行交换操作,而交换数组内部元素需要指针的指针。同时需要传入一个起始位置 left 和结束位置 right 用来指定排序的范围。

函数内部先判断需不需要排序,如果待排序元素个数为 1 或 0,则无需排序。否则,取第一个元素 pivot 作为基准值,从最左侧和最右侧开始寻找最靠近基准值的两个元素,进行交换操作并继续寻找。完成一次循环后,将基准值归位。

接下来递归地对分隔后的两部分数组进行排序,直到排序完成。

调用示例

将快速排序函数应用到示例植物数组 plants 上:

quicksort(plants, 0, sizeof(plants) / sizeof(struct Plant) - 1);

排序后,可以调用以下程序来展示每种植物的属性:

for (int i = 0; i < sizeof(plants) / sizeof(struct Plant); i++) {
    printf("HP: %d, ATK: %d, Cost: %d\n", plants[i]->hp, plants[i]->atk, plants[i]->cost);
}

使用示例:

#include <stdio.h>

struct Plant {
    int hp;
    int atk;
    int cost;
};

void quicksort(struct Plant *plants[], int left, int right) {
    // 省略快排实现
}

void print_plants(struct Plant *plants[], int size) {
    for (int i = 0; i < size; i++) {
        printf("HP: %d, ATK: %d, Cost: %d\n", plants[i]->hp, plants[i]->atk, plants[i]->cost);
    }
}

int main() {
    struct Plant plants[] = {
        {75, 36, 100},
        {100, 20, 50},
        {125, 24, 125},
        {150, 40, 175},
        {175, 60, 250},
        {200, 80, 325},
    };
    printf("Before sorting:\n");
    print_plants((struct Plant **)&plants, sizeof(plants) / sizeof(struct Plant));

    quicksort((struct Plant **)&plants, 0, sizeof(plants) / sizeof(struct Plant) - 1);
    printf("After sorting:\n");
    print_plants((struct Plant **)&plants, sizeof(plants) / sizeof(struct Plant));

    return 0;
}

输出结果为:

Before sorting:
HP: 75, ATK: 36, Cost: 100
HP: 100, ATK: 20, Cost: 50
HP: 125, ATK: 24, Cost: 125
HP: 150, ATK: 40, Cost: 175
HP: 175, ATK: 60, Cost: 250
HP: 200, ATK: 80, Cost: 325
After sorting:
HP: 100, ATK: 20, Cost: 50
HP: 125, ATK: 24, Cost: 125
HP: 75, ATK: 36, Cost: 100
HP: 150, ATK: 40, Cost: 175
HP: 175, ATK: 60, Cost: 250
HP: 200, ATK: 80, Cost: 325

从输出结果可以看出,植物按照攻击力升序排列。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言植物大战数据结构快速排序图文示例 - Python技术站

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

相关文章

  • C语言数据结构 双向链表的建立与基本操作

    C语言数据结构 双向链表的建立与基本操作 双向链表的定义 双向链表是一种常见的线性数据结构,它由多个结点组成,每个结点有两个指针,一个指向前一个结点,一个指向后一个结点。对于一个双向链表,我们可以获得其第一个结点和最后一个结点的指针,也可以沿着链表从前往后或从后往前遍历链表的每个结点。 双向链表的建立 我们首先需要定义一个双向链表的结点类型,包括两个指针,一…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论

    DAY10共2题: 月月给华华出题 华华给月月出题 难度较大。 ? 作者:Eriktse? 简介:211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/110…

    算法与数据结构 2023年4月17日
    00
  • Python数据结构之双向链表详解

    Python数据结构之双向链表详解 什么是双向链表? 在计算机科学中,双向链表是链表的一种,每个结点除了储存下一个结点的指针外,还储存着前一个结点的指针。这个“前进”指针被称为“ next指针”,而“后退”指针被称为“previous指针”。 双向链表和单向链表的区别在于,单向链表的每个结点只储存一个指向下一个结点的指针,而双向链表储存了前一个和后一个结点的…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构yocto queue队列链表代码分析

    JavaScript数据结构yocto queue队列链表代码分析 什么是队列? 队列(Queue)是一种基础的数据结构,属于线性结构,它的特点是在队列尾插入元素,同时在队列头删除元素,遵循先进先出(FIFO)的原则。队列可以简单的理解为排队,先到达的先被服务,而后到达的则等在队列尾排队等待。队列的应用非常广泛,例如排队系统、消息队列等。 队列的实现方式 队…

    数据结构 2023年5月17日
    00
  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 前言 顺序数组是数据结构的一个重要部分,它代表着一种基本的数据结构,能够在数据存储与访问方面发挥极大的作用。本文将详细讲解如何在C语言中实现顺序数组。 简介 顺序数组是在物理内存中顺序存储的一组元素数据,可以通过下标访问任意一个元素。通常情况下,顺序数组的数据类型是相同的,而且每一个元素的大小也是相同的。 实现 实现顺序数组主…

    数据结构 2023年5月17日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
  • 0-学习路线

    超详细的算法学习路线 https://cuijiahua.com/blog/2020/10/life-73.html   主要分为 4 个部分:数学基础、编程能力、算法基础、实战。 1、数学基础 在机器学习算法中,涉及到最为重要的数学基本知识有两个:线性代数和概率论。 这两也是大学的必修课了,如果知识早已还给老师,也没关系,哪里不会学补哪里。 线性代数研究的…

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构之学生信息管理系统课程设计

    C语言数据结构之学生信息管理系统课程设计 介绍 本文讲解学生信息管理系统的设计过程,包括需求分析、设计思路、实现步骤等。 需求分析 学生信息管理系统是一种常见的数据结构应用场景。通过该系统,可以实现对学生信息的有效管理和查询。在设计之前,我们需要明确系统的需求和功能,包括: 学生信息的录入、删除、修改和查询; 各类信息的统计和分析,如学生总数、男女比例等; …

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