因此,我有一个名为product
的结构,并且有一系列产品。
我正在尝试使用合并排序按产品价格对数组进行排序,问题是我的代码没有交换任何内容,我也不明白为什么。如果有人可以帮助我,我将不胜感激。
结构:
typedef struct product {
int ident; /* idp of a product */
char desc[64]; /* string that describes a product eg. "bread" */
int price; /* price of the product */
int weight; /* weight of the product eg. 2kg */
int quant; /* quantity of the product in stock */
int state_prod; /* state of a product, if 1 it is in the system else is 0 and is not in the sistem */
} product;
合并排序算法
void mergesort_price(product a[], int left, int right) {
int m = (right + left) / 2;
if (right <= left)
return;
mergesort_price(a, left, m);
mergesort_price(a, m + 1, right);
merge_price(a, left, m, right);
}
void merge_price(product a[], int left, int m, int right) {
int i, j, k;
for (i = m + 1; i > left; i--)
aux[i - 1] = a[i - 1];
for (j = m; j < right; j++)
aux[right + m - j] = a[j + 1];
for (k = left; k <= right; k++)
if (aux[j].price < aux[i].price || i > m)
a[k] = aux[j--];
else
if ((aux[j].price == aux[i].price) || i > m) {
if ((aux[j].ident < aux[i].ident) || i > m) {
a[k] = aux[j--];
}
} else
a[k] = aux[i++];
}
示例:
我的输入:
desc: pao, price:2, weight: 2, quant:200
desc: ovos, price:1, weight: 1, quant:100
desc: iscas, price:3, weight: 3, quant:300
desc: fiambre, price:2, weight: 2, quant:200
desc: queijo, price:2, weight: 2, quant:200
正确的输出:
desc: ovos, price:1, weight: 1, quant:100
desc: pao, price:2, weight: 2, quant:200
desc: fiambre, price:2, weight: 2, quant:200
desc: queijo, price:2, weight: 2, quant:200
desc: iscas, price:3, weight: 3, quant:300
程序:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_PROD 10000 /* max products in the system */
typedef struct product {
int ident; /* idp of a product */
char desc[64]; /* string that describes a product eg. "bread" */
int price; /* price of the product */
int weight; /* weight of the product eg. 2kg */
int quant; /* quantity of the product in stock */
int state_prod; /* state of a product, if 1 it is in the system else is 0 and is not in the system */
} product;
product p1 = { 0, "pao", 2, 2, 200, 1 };
product p2 = { 1, "ovos", 1, 1, 100, 1 };
product p3 = { 2, "iscas", 3, 3, 300, 1 };
product p4 = { 3, "bacon", 2, 5, 400, 1 };
product p5 = { 4, "abacate", 2, 6, 500, 1 };
product sistem[5] = {}; /* array that contains the products */
product sistem2[5] = {}; /* Will be used has a copy of sistem */
sistem[5] = { p1, p2, p3, p4, p5}
product aux[5]; /* Auxliar array used in mergesort */
void mergesort_price(product a[], int left, int right) {
int m = (right + left) / 2;
if (right <= left)
return;
mergesort_price(a, left, m);
mergesort_price(a, m + 1, right);
merge_price(a, left, m, right);
}
void merge_price(product a[], int left, int m, int right) {
int i, j, k;
for (i = m + 1; i > left; i--)
aux[i - 1] = a[i - 1];
for (j = m; j < right; j++)
aux[right + m - j] = a[j + 1];
for (k = left; k <= right; k++)
if (aux[j].price < aux[i].price || i > m)
a[k] = aux[j--];
else if ((aux[j].price == aux[i].price) || i > m) {
if ((aux[j].ident < aux[i].ident) || i > m) {
a[k] = aux[j--];
}
} else
a[k] = aux[i++];
}
void print_array(product arr[]) {
int i;
for (i = 0; i < 5; i++) {
printf("* %s %d %d %d\n", arr[i].desc, arr[i].price, arr[i].quant, arr[i].ident);
}
}
void copy_el(product source[], product dest[], int size) {
int i;
for (i = 0; i < size; i++) {
dest[i] = source[i];
}
}
int main() {
copy_el(sistem, sistem2, 5);
printf("The products in the system are:\n");
print_array(sistem);
printf("\nSorted products by price in the system:\n");
mergesort_price(sistem2, 5, 0);
print_array(sistem2);
return 0;
}
[我知道我键入的输入未在程序中进行编码,我只是以这种方式给出的输入作为示例,以使其更易于理解。
记住我在最前面的评论中提到的,您的for
循环是not