如何解决如何将 DTYPE 类型的实体分配给 SWAP
这是排序算法。我尝试根据结构中具有 x 和 y 的字段的 sum(x+y) 的大小降序排序。
我按照快速排序降序排列。但我有一个关于 SWAP(A[N/2].sum,A[0].sum);
和 pivot
的问题。
typedef struct DATA { double x; double y; double sum;} DTYPE;
//#define DTYPE double
#define SWAP(aa,bb) {DTYPE tmp; tmp = aa; aa=bb; bb=tmp;}
void sort_201821100(DTYPE A[],int N)
{
int piv;
if (N > 1) {
piv = partition(A,N);
sort_201821100(A,piv);
sort_201821100(A + piv + 1,N - piv - 1);
}
}
int partition(DTYPE A[],int N) {
int P = N / 2;
int i = 0,j = N;
for (i = 0; i < j; i++)
{
A[i].sum = A[i].x + A[i].y;
}
DTYPE pivot;
SWAP(A[N / 2].sum,A[0].sum);
pivot = A[0].sum;
while (1) {
while ((A[++i].sum > pivot) && (i < N));
while ((A[--j].sum < pivot) && (j > 0));
if (i >= j) break;
SWAP(A[i],A[j]);
}
SWAP(A[0],A[j]);
return j;
}
SWAP 无法将 Double
类型的值分配给 DTYPE
类型的实体。
而 pivot
需要一个算术形式。
我想知道如何分配 DTYPE 类型的实体并放置一个算术形式。
任何答复将不胜感激。最好的问候。
解决方法
你应该用两个函数替换掉你的 SWAP-Macro
-
void swap_dtype(DTYPE *a,DTYPE *b);
然后你可以调用swap_dtype(A,A+j) instead of SWAP(A[0],A[j])
-
void swap_double(double *a,double *b);
然后你可以调用swap_dtype(&(A[N / 2].sum),&(A[0].sum))
而不是SWAP(A[0],A[j])
如果这一切正常,您可以用宏替换这两个函数。由于宏容易出错,您应该仔细考虑这一步。
您还应该仔细考虑总和的交换。排序算法不应仅修改已排序元素的位置。这是违反直觉的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。