我在使用指针算术而不是常规索引表示法执行选择排序时遇到问题我必须这么做的原因是为了一个班级作业整个要点是学习使用指针算法而不使用“欺骗索引”(pointer + i
),其中i
将是这样的索引:array[i]
。
在调用sort函数之前,我会分配一个1000个结构的数组typedef如下:
typedef struct
{
char* name;
char* art;
int rating;
} ENTRY;
我的想法是读一个包含ASCII艺术的文件每件艺术品都会被扔进自己的结构中以下是文本文件中的一个“条目”:
Jean Pajerek
|\_____/|
|[o] [o]|
| V |
| |
-ooo---ooo-
# 4
是猫头鹰但我需要做的是将名称、艺术和评级存储在结构的相应字段中我的阅读功能很好我分配1000个结构数组,然后将文本文件读入其中它只包含了18张图片,所以不用担心。
现在让我们谈谈我的选择排序函数首先,我使用索引表示法研究了int数组的选择排序算法,然后尝试将其调整为适合我的需求。
使用指针算术
在结构中移动而不是在int中移动
下面是代码:
void sort(ENTRY* aryptr, int* counter)
{
ENTRY* slow;
ENTRY* fast;
ENTRY* lastmin;
ENTRY min;
ENTRY temp;
int i;
int j;
printf("\n\n...SORTING\n\n\n");
slow = aryptr;
for (i=0; i < *counter - 2; i++)
{
min = *slow;
fast = slow + 1;
for (j = i + 1; j < *counter-1; j++)
{
if (strcmp(fast->name, min.name) < 0 )
{
min = *fast;
lastmin = fast;
}
fast++;
}
temp = *slow;
*slow = min;
*lastmin = temp;
slow++;
}
}
我使用
i
和j
作为计数器,因为我觉得测试像walker->name != NULL
这样的东西是不安全的(我应该尝试使用空测试吗在我看来,如果我能保证最后一个元素之后的内容实际上是空的,那么它看起来更“逻辑上令人满意”。)不管我用什么来跟踪慢速和快速指针的位置,我对排序有问题。问题是这样的:我有一个art.txt文件,里面有很多不同的艺术品有些艺术品是同一个人的。
VOLDEMORT
(art is hippogryph)
# 1
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3
TONY STARK
(art is blob)
#1
EDDARD STARK
(art is dragon)
#5
当我完成排序时,同一作者的作品将在数组中相邻我不在乎同一个人的艺术顺序假设我用我的代码分类:我得到这样的东西。
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3
EDDARD STARK
(art is dragon)
#5
EDDARD STARK
(art is turtle)
# 4
TONY STARK
(art is blob)
#1
VOLDEMORT
(art is hippogryph)
# 1
埃达德·斯塔克(EDDARD STARK)整理好的艺术版块最后会有一个该版块中第一件艺术作品的副本我已经看过我的逻辑,打印了各种要调试的东西,但我仍然无法找出问题所在我想我就是看不到它,因为我看了我自己该死的代码太久了有什么想法吗?
最佳答案
void sort(ENTRY* aryptr, int* counter)
{
ENTRY* slow;
ENTRY* fast;
ENTRY* lastmin;
ENTRY min;
ENTRY temp;
int i;
int j;
printf("\n\n...SORTING\n\n\n");
slow = aryptr;
for (i=0; i < *counter - 2; i++)
{
min = *slow;
fast = slow + 1;
for (j = i + 1; j < *counter-1; j++)
{
if (strcmp(fast->name, min.name) < 0 )//comparison
{
min = *fast;//save data to min
lastmin = fast;//save position to last min
}
fast++;//increment index
}
//problematic, always swapping. need if statement. Lastmin
//May go unassigned, then "slow" will be duplicated to "lastmin"
temp = *slow;
*slow = min;
*lastmin = temp;//at first run through
slow++; //increment index
}
}
关于c - 选择与数组元素的指针排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10328224/