【问题标题】:Using selection sort with array of pointers使用带有指针数组的选择排序
【发布时间】:2013-10-31 03:52:00
【问题描述】:

我目前正在尝试使用选择排序对指针数组进行排序,但没有成功。我需要只用指针对一个 int 值数组进行排序。我已经在数组中存储了值,剩下要做的就是对这些值进行排序。

这是我的代码:

void fill_rand_ver2(int *pointer, int size)
{
int randNbr;
int *i;

for(i = pointer; i < (pointer + size); i++)
{
    randNbr = (rand()%10)+1;
    *i = randNbr;
}
}

// sort array with help of selection sort using pointer
void sort_ver2(int *pointer, int size)
{
int *i, *j, swap;

for(i = pointer; i < (pointer + size); i++)
{
    for(j = i + 1; j < (pointer + size); j++)
    {
        if(*j < *i)
        {
            swap = *i;
            *i = *j;
            *j = swap;
        }
    }
}
}

// print out both arrays using pointer
void print_values_ver2(char *string, int *pointer, int size)
{
int *i;

printf("%s", string);
printf("\n");

for(i = pointer; i < (pointer + size); i++)
{
    printf("%d,", *i);
}
printf("\n\n");
}

当我运行程序并打印数据时,输入的值没有排序并保持在同一位置。如有任何帮助,我将不胜感激。

【问题讨论】:

  • 嗯,我相信你是想按值排序,而不是按地址排序,所以应该是 if(*j
  • @KBart 将其作为答案发布,您有我的赞成票。请注意 OP,什么都不做的原因很简单:j 总是大于i)。 (j &lt; i+size) 在内部 for 条件中也不正确。如果pointer 序列确实只有size 元素宽,它将发送j 超出范围并进入未定义的行为。
  • @WhozCraig 是的,谢谢,我将编辑我的答案以注意不正确的范围。

标签: c arrays pointers selection-sort


【解决方案1】:

我相信你想按值排序,而不是按地址排序,所以应该是:

void sort_ver2(int *pointer, int size)
{
    int *i, *j, swap;
    int *end = NULL;

    if(size < 2 || pointer == NULL)
        return;

    end = pointer + size - 1;

    for(i = pointer; i < end; i++)
    {
        for(j = i + 1; j <= end; j++)
        {
            if(*j < *i)
            {
                swap = *i;
                *i = *j;
                *j = swap;
            }
        }
    }
}

即使您想按地址排序,您的 if 语句也不正确,因为在您的代码中 j 总是大于 i .

编辑:添加 end 变量以解决内部 for 循环范围不正确的问题。感谢@WhozCraig。

【讨论】:

  • 我想按值排序,我试过你的方法。但它似乎仍然没有排序。你建议我如何更改我的 if 语句?
  • “不排序”是什么意思?你得到运行时错误吗?如果否,则显示您的 main(),可能是您的其余代码有问题。
  • 这几乎奏效了。除了一件事,第一个输出没有排序,它写了-858993460之类的东西。运行时检查失败 #2 - 变量“数组”周围的堆栈已损坏。
  • @Wooolie,这取决于你传递的 size 参数,我猜是你使用的元素数量,所以现在检查一下。
  • 是的,我只使用了 j
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2020-01-08
  • 1970-01-01
  • 2015-04-10
  • 2017-09-03
  • 2021-11-26
相关资源
最近更新 更多