如何在选择排序中计算比较?

How to count comparisons in selectionsort?

本文关键字:计算 比较 排序 选择      更新时间:2023-10-16

如何计算selectionsort中的比较?

条款: 当您为查找最大值而执行的语句为"true"时 然后计算比较。

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

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

#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);
}

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

你没有计算正确的东西,这段代码

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

另一个问题是你没有给计数一个零的初始值

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

应该是

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

如何计算比较选择排序?

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

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

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

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

新变量 'first' , first=sort[MAX] 首先插入循环, - 没有工作

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

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

#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
}

您计算的是掉期次数,而不是比较次数。

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

#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("%dn", count);
return 0;
}

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