如何在选择排序中计算比较?
How to count comparisons in selectionsort?
如何计算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<n
或i<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
交换。
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么将三个变量与 == 一起比较会计算为 false?
- 自定义迭代器:如果 a 和 b 的行为不同,如何正确处理距离计算和相等比较
- 计算变量并进行比较
- 计算搜索比较C++
- 如何在选择排序中计算比较?
- 计算在堆排序中完成的比较次数
- 几个比较怎么可能比一些计算慢
- C++日期比较并不总是计算出相同的逻辑值
- 通过比较数组中的相邻元素来计算交换次数
- 如何计算二叉搜索树中的比较
- 计算选择排序中的比较次数时出错
- 计算比较数和QuickSort C 中的移动
- 计算QuickSort算法中的组件明智比较数量
- c++:旋转锁或互斥对象比较(简单计算)
- 使用构造函数来比较/计算用户输入
- 在快速排序中计算比较
- 计算快速排序中的比较次数
- 我如何计算比较的次数?(哈希表)