2

我在使用指针算术而不是使用常规索引表示法执行选择排序时遇到问题。我必须这样做的原因是为了课堂作业。关键是要学会使用没有“作弊索引”(pointer + i)的指针算法,其中i的索引是这样的:array[i].

在调用排序函数之前,我分配了一个包含 1000 个结构的数组。类型定义如下:

typedef struct
{
    char* name;
    char* art;
    int rating;
} ENTRY;

这个想法是我读了一个包含 ASCII 艺术的文件。每件艺术品都被投入到自己的结构中。这是文本文件中的一个“条目”:

Jean Pajerek
  |\_____/|
  |[o] [o]|
  |   V   |
  |       |
 -ooo---ooo-
# 4

这是一只猫头鹰!但我需要做的是将名称、艺术和评级存储在结构的相应字段中。我的阅读功能完美无缺。我分配了 1000 个结构的数组,然后将文本文件读入其中。它只包含 18 张图片,所以不用担心。

现在让我们谈谈我的选择排序功能。我首先查看了使用索引表示法的整数数组的选择排序算法,然后我尝试使其适应我的要求。

  1. 使用指针算术
  2. 在结构而不是整数周围移动

所以这里是代码:

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++;      

    }
}

我使用iandj作为计数器,因为我觉得测试类似的东西walker->name != NULL是不安全的。(我是否应该尝试使用 NULL 测试?这对我来说似乎更“逻辑上令人满意”,如果我可以保证最后一个元素之后的东西实际上是 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 排序的艺术块将在 END 的那个块中拥有第一件艺术作品的副本。我查看了我的逻辑,打印了各种要调试的东西,但我仍然无法弄清楚问题出在哪里。我想我只是看不到它,因为我已经看了我自己该死的代码这么久了。有任何想法吗?

4

1 回答 1

1
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

    }
}
于 2012-04-26T07:38:47.877 回答