Ошибка в реализации сортировки Selection в C - PullRequest
1 голос
/ 27 мая 2020

Цель упражнения, которое я сейчас пытаюсь решить и понять, - создать функцию сортировки выбора общего назначения, а именно функцию сортировки, которая работает как с целыми числами, так и с типами данных double. Базовый c алгоритм сортировки по выбору был приведен в упражнении, поэтому все, что мне нужно сделать, это расширить его использование для более чем одного типа данных. Моя реализация функции выглядит следующим образом, что похоже на решение, предложенное автором:

void selection_sort(void *p, int n, enum data d)
{
    int i,j,pos;

    switch(d)
    {
        case INT:
            for (i=0; i<n; i++)
            {
                pos=i;

                for (j=i+1; j<n; j++)
                {
                    if (((int *)p)[j]<((int *)p)[pos])
                        pos=j;
                }

                swap(&((int *)p)[i], &((int *)p)[pos], d);
            }
            break;

        case DOUBLE:
            for (i=0; i<n; i++)
            {
                pos=i;

                for (j=i+1; j<n; j++)
                {
                    if (((double *)p)[j]<((double *)p)[pos])
                        pos=j;
                }

                swap(&((double *)p)[i], &((double *)p)[pos], d);
            }
            break;

        default:
            exit(1);
    }   
}

Моя реализация функции подкачки показана ниже:

    void swap(void *a, void *b, enum data d){

    switch(d)
    {
        case INT:
            *((int *)a) = *((int *)a)+*((int *)b);
            *((int *)b) = *((int *)a)-*((int *)b);
            *((int *)a) = *((int *)a)-*((int *)b);
            break;



        case DOUBLE:

            *((double *)a) = *((double *)a)+*((double *)b);
            *((double *)b) = *((double *)a)-*((double *)b);
            *((double *)a) = *((double *)a)-*((double *)b);
            break;
    } 
}

Здесь мои проблема начинается. Предлагаемая реализация функции подкачки выглядит так:

    void swap(void *a, void *b, enum data d)
{
    int tempi;
    double tempd;

    switch(d)
    {
        case INT:
            tempi=*(int *)a;
            *(int *)a=*(int *)b;
            *(int *)b=tempi; 
            break; 
        case DOUBLE:
            tempd=*(double *)a;
            *(double *)a=*(double *)b;
            *(double *)b=tempd;             
    }
}

, которая работает с остальной частью моего кода, однако, когда я использую свою реализацию функции подкачки, она выдает ошибки. В предложенном решении автор создает временную переменную для целочисленного случая и одну для двойного случая, которые не нужны одновременно, поэтому в своей реализации я подумал о том, чтобы сэкономить место и немного его оптимизировать. Моя основная функция показана ниже:

#include <stdio.h>
#include <stdlib.h>

enum data{INT, DOUBLE};

void selection_sort(void *pinakas, int n, enum data d);
void swap(void *a, void *b, enum data d);

int main()
{
  int a[10]={1,4,7,5,6,8,6,2,3,3};
  int i;

  for (i=0; i<10; ++i)
  {
      printf("%d ", a[i]);
  }
  printf("\n");
  selection_sort(a, 10, INT);

  for (i=0; i<10; ++i)
  {
     printf("%d ", a[i]);
  }

  return 0; 
  }

При использовании авторской функции мой результат выглядит так:

1 4 7 5 6 8 6 2 3 3
1 2 3 3 4 5 6 6 7 8

Однако при использовании моей реализации я получаю следующее:

1 4 7 5 6 8 6 2 3 3
0 2 3 3 4 5 0 0 0 0

и я не понимаю почему. Я потратил довольно много времени, пытаясь найти ошибку, беспокоясь, что это могло быть что-то более глубокое в указателях, которые мне сейчас не хватает.

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...