使用指向数组元素的指针进行选择排序

时间:2012-04-26 06:23:19

标签: c arrays sorting pointers

我在使用指针算法执行选择排序时遇到问题,而不是使用常规索引表示法。我必须这样做的原因是课堂作业。重点是学习使用指针算法而不使用“作弊索引”(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个图像,所以不用担心。

现在让我们谈谈我的选择排序功能。我首先看一下使用索引表示法的整数数组的选择排序算法,然后我尝试根据我的要求调整它。

  1. 使用指针算法
  2. 移动结构而不是整体
  3. 所以这是代码:

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

    我正在使用ij作为计数器,因为我觉得测试像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的那个区块中拥有第一件艺术品的副本。我看了我的逻辑,打印了各种东西进行调试,但我仍然无法弄清楚问题出在哪里。我想我将无法看到它,因为我已经看了我自己该死的代码这么久。有什么想法吗?

1 个答案:

答案 0 :(得分: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

    }
}