【问题标题】:How to count comparisons in selectionsort?如何计算选择排序中的比较?
【发布时间】:2019-04-09 14:31:22
【问题描述】:

如何计算selectionsort中的比较?

条款: 当您执行查找最大值的语句为“真”时 然后计数比较。

获取最大值的值保存在数组的第一个元素中,而不是随机的。

我尝试使用 C 可变计数位置变化 - 没有工作 新变量 'first' ,first=sort[MAX] 先插入 for 循环,- 没用

#include <stdio.h>

int main() {
    int sort[10000], i, n, MAX, temp, count;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
       scanf("%d", &sort[i]);
    }
    for (MAX = 0; MAX < n; MAX++)
        for (i = MAX + 1; i < n; i++) {
            if (sort[MAX] > sort[i]) {
                count++;
                temp = sort[MAX];
                sort[MAX] = sort[i]; 
                sort[i] = temp;
            }
        }

    printf("%d  ", count);
    return 0;
}

示例输入

10
0 7 1 6 7 7 6 6 5 4 

样本输出

17

编辑:新代码:

#include <stdio.h>
#define SWAP(x, y, temp) ( (temp)=(x), (x)=(y), (y)=(temp) )

int count = 0;

void selection_sort(int list[], int n) {
    int i, j, least, temp;

    for (i = 0; i < n - 1; i++) {
        least = i;

        for (j = i + 1; j < n; j++) {
            if (list[j] < list[least]) {
                least = j;
                count++;
            }
        }
        SWAP(list[i], list[least], temp);
    }
}

int main() {
    int list[10000], i, n;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &list[i]);
    };
    selection_sort(list, n);

    printf("%d", count);
}

这个怎么样?为什么这段代码也没有移动?

【问题讨论】:

  • 呃,first是怎么初始化的?
  • 对不起我的小姐。代码是没有使用变量的第一个版本。但我尝试 (for{ first=sort[MAX] for{}}
  • “如何计算比较选择排序”不是一个有效的句子,其余的不是更具可读性。改进文本。
  • @skytrack31:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c++ c selection-sort


【解决方案1】:

这段代码你没算对

     if(sort[MAX]>sort[i])  
     {
        count++;
         temp=sort[MAX];
         sort[MAX]=sort[i]; 
         sort[i]=temp;
     }

计算两个数字交换的次数。但是你想计算比较所以应该是这样的

     count++;
     if(sort[MAX]>sort[i])  // this is what we are counting
     {
         temp=sort[MAX];
         sort[MAX]=sort[i]; 
         sort[i]=temp;
     }

另一个问题是你没有给 count 一个初始值为零

int sort[10000],i,n,MAX,temp,count;

应该是

int sort[10000],i,n,MAX,temp,count = 0;

【讨论】:

  • 好的。尽管如此,我改变了count++位置,输出'45'。我认为..因为第一个术语..(语句 = true,然后计数)
  • @skytrack31 那么你知道正确的结果是什么吗?对于大小为 10 的输入,45 听起来对我来说是正确的结果。
  • 如问题所写,样本输出为 17。(样本输入:10 0 7 1 6 7 7 6 6 5 4)
  • 那我认为你的算法是错误的。您编写的代码进行了 45 次比较。
  • 或者你需要计算的东西的理解是错误的。
【解决方案2】:

如何计算比较选择排序?

您对该术语的定义措辞奇怪,但它似乎旨在关注算法的基本比较,而不是出于其他目的或在库函数内部偶然执行的比较。也就是说,在您提供的实现中(我不评估其正确性),您将计算sort[MAX]&gt;first 的每次评估,但不计算MAX&lt;ni&lt;n

您似乎为此目的使用了变量count,但您只计算了评估为真的比较。基于所提出的措辞和我对此类问题的一般预期,我对该问题的解释是,无论结果如何,对sort[MAX]&gt;first 的每次评估都应该计算在内。这可以通过将表达式 count++if 块中提升出来,但将其留在内部封闭的 for 循环中来实现。

当然,正如@john 所说,您确实需要在开始排序之前将count 初始化为0。您可能会碰巧得到它,但是没有初始化器的局部变量的初始值是不确定的(至少),直到分配一个值。

我尝试使用 c 变量计数位置更改 - 没有工作

新变量 'first' ,first=sort[MAX] 先插入 for 循环,- 无效

即使您的增量错位到 count,如果您的排序实际上正在工作,那么您希望看到大多数输入的 一些 计数。你没有这样做是一个好兆头,表明你的排序实际上不能正常工作。我建议也输出排序结果,以便您可以调试排序算法的详细信息。

【讨论】:

  • 我修改了我的问题。 (以及细节)你能再看一个吗?
  • 同意,@john。已编辑。
  • 每个问题一个问题,@skytrack31。但是作为临别礼物,我观察到您的新代码与该答案已经描述的完全相同的问题:由于增加count 的语句的位置,它只计算评估为的比较是的。
【解决方案3】:

您可以将比较抽象为一个函数或宏,该函数或宏也会增加一个计数器。宏观方法可以是

#define GT(x,y,counter) (counter++, (x) > (y) ? 1 : 0)
...
if ( GT( sort[MAX], sort[i], count ) == 1 )
{
  // perform swap
}

而函数方法是

int gt( int x, int y, int *counter )
{
  (*counter)++;
  if ( x > y )
    return 1;
  return 0;
}
...
if ( gt( sort[MAX], sort[i], &count ) == 1 )
{
  // perform swap
}

【讨论】:

  • 可以简化为#define GT(x,y,counter) (counter++, (x) &gt; (y))
【解决方案4】:

您计算的是交换次数,而不是比较次数。

这是一个没有全局变量和一些额外检查的更正:

#include <stdio.h>
#define SWAP(x, y, temp) ((temp) = (x), (x) = (y), (y) = (temp))

int selection_sort(int list[], int n) {
    int count = 0;
    int i, j, least, temp;

    for (i = 0; i < n - 1; i++) {
        least = i;
        for (j = i + 1; j < n; j++) {
            count++;
            if (list[j] < list[least]) {
                least = j;
            }
        }
        SWAP(list[i], list[least], temp);
    }
    return count;
}

int main() {
    int list[10000], i, n, count;

    if (scanf("%d", &n) != 1 || n > 10000)
        return 1;
    for (i = 0; i < n; i++) {
        if (scanf("%d", &list[i]) != 1)
            return 1;
    }
    count = selection_sort(list, n);

    printf("%d\n", count);
    return 0;
}

但并不是说您的算法将始终对任何一组n 值执行相同数量的比较:n * (n - 1) / 2 比较,并且由于您不测试i != least,它将执行n - 1 交换。

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2021-09-04
    • 2015-05-21
    相关资源
    最近更新 更多