2012-04-26 4 views
2

У меня возникла проблема с сортировкой выбора с использованием арифметики указателя, а не с использованием стандартного нотации индекса. Причина, по которой я должен это сделать, - это присвоение класса. Все дело в том, чтобы научиться использовать арифметику указателей без «индексации читеров» (pointer + i), где i будет индексом как таковым: array[i].Сортировка выбора с указателями на элементы массива

Прежде чем вызвать функцию сортировки, я выделил массив из 1000 структур. Typedef выглядит следующим образом:

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

Идея состоит в том, что я читаю файл, содержащий ASCII-арт. Каждое произведение искусства бросается в его собственную структуру. Вот одна «запись» из текстового файла:

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

Это сова! Но мне нужно сохранить имя, искусство и рейтинг в соответствующем поле структуры. Моя функция чтения работает отлично. Я выделяю массив из 1000 структур, а затем просто читаю текстовый файл. Он содержит только 18 изображений, поэтому не стоит беспокоиться.

Теперь давайте поговорим о моей функции выбора сортировки. Я начал с рассмотрения алгоритма сортировки выбора для массивов int с использованием нотации индекса, затем я попытался адаптировать его к моим требованиям.

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

    } 
} 

Я использую i и j как счетчики, потому что я чувствовал, что тестирование для чего-то вроде 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 

отсортированный блок искусства Эддард Старк будет иметь копию первой части искусства в этом блоке в конце. Я посмотрел на свою логику, напечатал различные вещи для отладки, но я до сих пор не могу понять, где проблема. Думаю, я просто не смогу это увидеть, потому что так долго смотрел на свой проклятый код. Есть идеи?

+1

Мне нравится сова. – st0le

ответ

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 

    } 
} 
+0

Мне потребовалось некоторое время, чтобы понять, какое условие мне нужно, но я получил его для работы по мере необходимости! Не могу поверить, что я не видел чего-то столь ослепительно очевидного. Спасибо! – GrinReaper

Смежные вопросы