Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的选择排序实现中出错_C_Algorithm_Sorting - Fatal编程技术网

C中的选择排序实现中出错

C中的选择排序实现中出错,c,algorithm,sorting,C,Algorithm,Sorting,我目前试图解决和理解的练习的目的是创建一个通用的选择排序函数,即一个适用于整数和双精度数据类型的排序函数。练习中给出了选择排序的基本算法,因此我所要做的就是将其用法扩展到多种类型的数据。我的函数实现如下,这似乎与作者建议的解决方案相匹配: void selection_sort(void *p, int n, enum data d) { int i,j,pos; switch(d) { case INT: for (i=0; i

我目前试图解决和理解的练习的目的是创建一个通用的选择排序函数,即一个适用于整数和双精度数据类型的排序函数。练习中给出了选择排序的基本算法,因此我所要做的就是将其用法扩展到多种类型的数据。我的函数实现如下,这似乎与作者建议的解决方案相匹配:

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)
{
    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;             
    }
}
1 4 7 5 6 8 6 2 3 3
1 2 3 3 4 5 6 6 7 8
这适用于我的其余代码,但是当我使用swap函数的实现时,它会抛出错误。在建议的解决方案中,作者为整型和双型创建了一个临时变量,这两个变量不是同时需要的,因此在我的实现中,我考虑了节省一些空间并对其进行了一些优化。我的主要功能如下所示:

    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;
    } 
}
#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
0 2 3 3 4 5 0 0 0 0
我不明白为什么。我花了相当长的时间试图找到错误,担心它可能是关于我现在缺少的指针的更深层次的东西


提前谢谢

当你的交换函数被要求与自身交换一个元素时,它会发生什么情况?@EricPostpischil感谢你指出这一点,我实际上错过了它,尝试了一个不重复的数字列表,但在最后4位一直得到0,仍然无法找出原因。通常,当你在C中设计一个通用数组操作函数时,最终得到的签名类似于标准C中的
qsort()
bsearch()
签名。您得到一个指向数组开头的指针、每个项的大小、项的数量,以及一个指向用于进行比较的函数的指针。您并不是在真正编写泛型代码。您的代码可以处理两种类型中的任何一种,但它也不能处理字符串数组或结构数组,或者…@summer,并且您的交换算法仅在两个数字的地址不同而不是它们的值不同时才起作用。换句话说,它仅在
参数不相同时起作用。此外,当这两个数字非常大时,
add
将溢出,这也会导致错误答案。用这种方法交换两个数字,它的执行速度似乎比使用临时变量慢。@JonathanLeffler这是一个更进一步的步骤,但从技术上讲,它只适用于这两种数据类型,所以我不想麻烦使用更通用的方法。当您的交换函数被要求与自身交换一个元素时,会发生什么情况?@EricPostChil感谢您指出这一点,事实上,我错过了它,尝试了一个非重复数字列表,但在最后4位中不断得到0,仍然无法找出原因。通常,当你在C中设计一个通用数组操作函数时,你会得到一个类似于
qsort()
bsearch()的签名
在标准C中。您可以获得一个指向数组开头的指针、每个项的大小、项的数量,以及一个指向用于进行比较的函数的指针。您并不是在真正编写泛型代码。您的代码可以处理两种类型中的任何一种,但它也不能处理字符串数组或结构数组,或者…@summer,并且您的交换算法仅在两个数字的地址不同而不是它们的值不同时才起作用。换句话说,它仅在
参数不相同时起作用。此外,当这两个数字非常大时,
add
将溢出,这也会导致错误答案。使用这种方法交换两个数字,执行速度似乎比使用临时变量慢。@JonathanLeffler这是一个更进一步的步骤,但从技术上讲,它只适用于这两种数据类型,所以我不需要使用更通用的方法