void siftDown(node& n, int low, int high)//筛选 { int i = low; int j = 2 * i + 1; medicine tmp = n.data[i]; while (j <= high) { if (j < high && n.data[j].sale < n.data[j + 1].sale) { j++; } if (tmp.sale < n.data[j].sale) { n.data[i] = n.data[j]; i = j; j = 2 * i + 1; } else break; } n.data[i] = tmp; } void HeapSort(node& n, int k)//堆排序法 { node no = n; for (int i = k / 2 - 1; i >= 0; i--) siftDown(no, i, k - 1); for (int i = k - 1; i > 0; i--) { swap(no.data[0], no.data[i]); siftDown(no, 0, i - 1); } Display(no); system("pause"); system("cls"); }解释代码
时间: 2024-01-22 16:04:23 浏览: 49
这段代码实现了堆排序算法,用于对一个结构体 node 中存储的数据进行排序。其中,siftDown 函数是对堆进行筛选的过程,HeapSort 函数则是堆排序的具体实现。
具体来说,HeapSort 函数首先对整个结构体进行一次从下到上的堆化,即从最后一个非叶子节点开始,对每个节点进行 siftDown 操作,使得整个结构体成为一个大根堆。然后,从最后一个元素开始,与堆顶元素进行交换,并对剩下的元素进行 siftDown 操作,直到所有元素都排好序。
siftDown 函数的具体实现是:首先将当前节点 i 对应的元素 tmp 存储起来,然后从 2*i+1 开始,找到当前节点的两个子节点中较大的一个。如果该子节点比另一个子节点还要小,则将 j 指向另一个子节点。接着比较 tmp 和 n.data[j] 的大小,如果 tmp 比 n.data[j] 小,则将 n.data[j] 移动到当前节点 i 的位置,同时将 i 更新为 j,j 更新为 2*i+1,继续进行下一轮的比较。如果 tmp 比 n.data[j] 大,则说明当前位置已经符合堆的要求,退出循环即可。
最后,HeapSort 函数调用 Display 函数进行结果的显示,并通过 system 函数暂停程序的执行,清空屏幕,以便下一次的输入输出。
相关问题
#include <iostream> #include <fstream> #include<string> #include "nlohmann/json.hpp" using json = nlohmann::json; // 定义链表节点 struct Node { int comment; std::string from; std::vector<std::string> comments; std::string to; float score; std::string corp; std::string time; Node* next; }; void readJsonToLinkedList(std::string filename, Node*& head) { std::ifstream infile(filename); json j; infile >> j; for (auto& element : j) { Node* newNode = new Node(); newNode->comment = element["comment"]; newNode->from = element["from"]; newNode->comments = element["comments"]; newNode->to = element["to"]; newNode->score = std::stof(element["score"].get<std::string>()); newNode->corp = element["corp"]; newNode->time = element["time"]; // 插入节点到链表尾部 if (head == nullptr) { head = newNode; } else { Node* current = head; while (current->next != nullptr) { current = current->next; } current->next = newNode; } } } //从链表中进行筛选的函数 void saveRecords(Node* head, float lowerBound, float upperBound) { std::ofstream outfile("results.dat"); Node* current = head; while (current != nullptr) { if (current->score >= lowerBound && current->score <= upperBound) { outfile << current->from << "," << current->to << "," << current->score << std::endl; } current = current->next; } outfile.close(); } int main() { Node* head = nullptr; readJsonToLinkedList("C:\\Users\\86130\\source\\repos\\数据结构课程设计\\rating.json", head); // 从用户输入中获取评分范围 float low, high; std::cout << "请输入评分下界: "; std::cin >> low; std::cout << "请输入评分上界:"; std::cin >> high; saveRecords(head, low, high); return 0; }对于该代码是如何进行数据处理的
该代码是一个 C++ 程序,它通过读取一个 JSON 格式的文件并将其转换为链表的形式,然后根据用户输入的评分范围筛选链表中的节点数据,并将结果保存到一个名为 "results.dat" 的文件中。
具体来说,该程序首先定义了一个链表节点 Node,其中包含了评分(comment)、评分者(from)、被评分者(to)、评论(comments)、评分时间(time)、评分公司(corp)和得分(score)七个属性,以及一个指向下一个节点的指针 next。
然后,程序定义了一个函数 readJsonToLinkedList,用于将 JSON 文件中的数据读入到链表中。该函数首先打开指定的文件,然后使用 nlohmann/json 库对文件内容进行解析,解析后的数据存储在一个名为 j 的变量中。接着,程序遍历 j 中的每一个元素,即每一条评分记录,为它创建一个新的链表节点,并将该节点插入到链表的尾部。
最后,程序定义了一个名为 saveRecords 的函数,用于从链表中筛选出评分在指定范围内的节点,并将它们的评分者、被评分者和得分保存到一个名为 "results.dat" 的文件中。
在 main 函数中,程序首先定义了一个头指针 head,并将其初始化为 nullptr。然后,程序调用 readJsonToLinkedList 函数,将指定的 JSON 文件读入到链表中。接着,程序提示用户输入评分范围,然后调用 saveRecords 函数,将符合条件的节点数据保存到文件中。最后,程序返回 0,表示程序正常结束。
5. 药店的药品销售统计系统(排序) [问题描述] 设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。 [实现提示] 在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。 药品信息的元素类型定义: typedef struct node { char num[4]; /*药品编号*/ char name[10]; /*药品名称*/ float price; /*药品单价*/ int count; /*销售数量*/ float sale; /*本药品销售额*/ }DataType; 存储药品信息的顺序表的定义: typedef struct { DataType r[MaxSize]; int length; }SequenList; 用c语言写
以下是药店药品销售统计系统的排序部分的代码实现(包括基数排序、冒泡排序、快速排序和堆排序):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 1000
typedef struct node {
char num[4]; /*药品编号*/
char name[10]; /*药品名称*/
float price; /*药品单价*/
int count; /*销售数量*/
float sale; /*本药品销售额*/
} DataType;
typedef struct {
DataType r[MaxSize];
int length;
} SequenList;
/* 基数排序 */
int GetDigit(char *num, int d)
{
return num[d - 1] - '0';
}
void RadixSort(SequenList *L)
{
int i, j, k, q;
int bucket[10], max = 0, d = 1;
DataType temp[MaxSize];
for (i = 0; i < L->length; i++) {
if (strlen(L->r[i].num) > max) {
max = strlen(L->r[i].num);
}
}
for (i = 0; i < max; i++) {
memcpy(temp, L->r, sizeof(DataType) * L->length);
memset(bucket, 0, sizeof(bucket));
for (j = 0; j < L->length; j++) {
k = GetDigit(temp[j].num, d);
bucket[k]++;
}
for (j = 1; j < 10; j++) {
bucket[j] += bucket[j - 1];
}
for (j = L->length - 1; j >= 0; j--) {
k = GetDigit(temp[j].num, d);
L->r[--bucket[k]] = temp[j];
}
d++;
}
}
/* 冒泡排序 */
void BubbleSort(SequenList *L)
{
int i, j;
DataType temp;
for (i = 0; i < L->length - 1; i++) {
for (j = 0; j < L->length - 1 - i; j++) {
if (L->r[j].price > L->r[j + 1].price) {
temp = L->r[j];
L->r[j] = L->r[j + 1];
L->r[j + 1] = temp;
}
}
}
}
/* 快速排序 */
int Partition(SequenList *L, int low, int high)
{
DataType pivotkey = L->r[low];
while (low < high) {
while (low < high && L->r[high].count <= pivotkey.count) {
high--;
}
L->r[low] = L->r[high];
while (low < high && L->r[low].count >= pivotkey.count) {
low++;
}
L->r[high] = L->r[low];
}
L->r[low] = pivotkey;
return low;
}
void QuickSort(SequenList *L, int low, int high)
{
int pivotloc;
if (low < high) {
pivotloc = Partition(L, low, high);
QuickSort(L, low, pivotloc - 1);
QuickSort(L, pivotloc + 1, high);
}
}
/* 堆排序 */
void HeapAdjust(SequenList *L, int s, int m)
{
int i;
DataType temp = L->r[s];
for (i = 2 * s; i <= m; i *= 2) {
if (i < m && L->r[i].sale < L->r[i + 1].sale) {
i++;
}
if (temp.sale >= L->r[i].sale) {
break;
}
L->r[s] = L->r[i];
s = i;
}
L->r[s] = temp;
}
void HeapSort(SequenList *L)
{
int i;
DataType temp;
for (i = L->length / 2; i > 0; i--) {
HeapAdjust(L, i, L->length);
}
for (i = L->length; i > 1; i--) {
temp = L->r[1];
L->r[1] = L->r[i];
L->r[i] = temp;
HeapAdjust(L, 1, i - 1);
}
}
int main()
{
int i;
SequenList L = {
{{"A123", "Drug1", 5.5, 100, 550}, {"B234", "Drug2", 3.3, 200, 660}, {"C345", "Drug3", 2.5, 150, 375}},
3
};
RadixSort(&L);
printf("按编号排序:\n");
for (i = 0; i < L.length; i++) {
printf("%s %s %.2f %d %.2f\n", L.r[i].num, L.r[i].name, L.r[i].price, L.r[i].count, L.r[i].sale);
}
BubbleSort(&L);
printf("按单价排序:\n");
for (i = 0; i < L.length; i++) {
printf("%s %s %.2f %d %.2f\n", L.r[i].num, L.r[i].name, L.r[i].price, L.r[i].count, L.r[i].sale);
}
QuickSort(&L, 0, L.length - 1);
printf("按销售量排序:\n");
for (i = 0; i < L.length; i++) {
printf("%s %s %.2f %d %.2f\n", L.r[i].num, L.r[i].name, L.r[i].price, L.r[i].count, L.r[i].sale);
}
HeapSort(&L);
printf("按销售额排序:\n");
for (i = 0; i < L.length; i++) {
printf("%s %s %.2f %d %.2f\n", L.r[i].num, L.r[i].name, L.r[i].price, L.r[i].count, L.r[i].sale);
}
return 0;
}
```
阅读全文