我在使用以下 VS 2010 代码时遇到问题。我正在尝试对结构数组进行排序。代码编译无误,速度很快,但存在排序结果不正确的问题。
我按“zip”字符串排序(出于测试目的,不是按数字,而是按字符比较)。我有一个使用标准库 qsort 运行的版本,但想做一些进一步的调整,所以我自己写。
struct address {
char name[40];
char street[40];
char city[20];
char state[30];
char zip[21];
};
void qs_struct(struct address items[], int left, int right)
{
int i, j;
char *x;
struct address temp;
i = left;
j = right;
x = items[(left+right)/2].zip;
do {
while((strcmp(items[i].zip,x) < 0) && (i < right)){ i++;}
while((strcmp(items[j].zip,x) > 0) && (j > left)) { j--;}
if(i <= j) {
temp = items[i];
items[i] = items[j];
items[j] = temp;
i++; j--;
}
} while(i <= j);
if(left < j) qs_struct(items, left, j);
if(i < right) qs_struct(items, i, right);
}
void qx(struct address items[], int count)
{
qs_struct(items,0,count-1);
}
void fillStructWithRandomDataForTest(struct address *addr, int i, int j)
{
char temp[444];
sprintf(temp, "%d%d", j +i, j*i);
strcpy(addr->name, temp);
sprintf(temp, "%d%d", j +i, j*i);
strcpy(addr->street, temp);
sprintf(temp, "%d%d", j +i, j*i);
strcpy(addr->city, temp);
sprintf(temp, "%d%d", j +i, j*i);
strcpy(addr->state, temp);
sprintf(temp, "%d%d", j +i, j*i);
strcpy(addr->zip, temp);
}
void xqs(void)
{
struct address addrs[20];
for (int i = 0, j = 33; i < 16; ++i, --j)
fillStructWithRandomDataForTest(&addrs[i], i, j);
qx(addrs, 16);
// results: incorrectly sorted
for (int k = 0; k < 16; ++k)
printf("%s \n",addrs[k].zip);
}
最佳答案
如果您能准确地告诉我们您的结果不正确的方式,那就太好了,但这没关系,让我猜猜:它什么都不打印,对吧?全是空行,嗯?
代码中的最后一个循环使用 k
作为循环计数器,但随后它使用 i
作为索引来选择一个结构到 printf()
。这将始终选择尚未初始化的 addrs[16]
。
你需要咖啡。或者 sleep 。但不是两者。
关于c - 快速排序结构数组 : incorrect sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690494/