我的选择排序有什么问题?
What is wrong with my selection sort?
我的选择排序实现在 j < n-2 或 n-1 或 [=18= 的情况下不起作用]n。我做错了什么?
是否有在线 IDE 让我们监视控制回路?
#include <stdio.h>
#define n 4
int main(void) {
int a[n]={4,3,2,1};
int j,min;
for(int i=0;i<n;i++){
min=i;
for(j=i+1;j<n-3;j++)
if(a[j]>a[j+1])
min=j+1;
if(min!=i){
int t=a[min];
a[min]=a[i];
a[i]=a[t];
}
}
for(int i=0;i<n;i++)
printf("%d",a[i]);
return 0;
}
你的代码确实对 n-3
有一个奇怪的限制,但它也有一些其他的缺陷:
- 要找到最小值,您应该与当前最小值 (
a[min]
) 进行比较,而不是数组中的 next/previous 元素
- 要交换的代码不正确:最后的赋值不应来自
a[t]
,而是 t
本身。
这是更正后的代码:
int main(void) {
int a[n]={4,3,2,1};
int j,min;
for(int i=0;i<n;i++){
min=i;
for(j=i+1;j<n;j++)
if(a[min]>a[j])
min=j;
if(min!=i){
int t=a[min];
a[min]=a[i];
a[i]=t;
}
}
for(int i=0;i<n;i++)
printf("%d",a[i]);
return 0;
}
注意:要在在线 IDE 中查看中间结果,为什么不在循环内添加 printf 调用?当然,对于较大的代码项目,您最好使用本地安装的具有所有调试功能的 IDE,并单步执行代码。
我的选择排序实现在 j < n-2 或 n-1 或 [=18= 的情况下不起作用]n。我做错了什么?
是否有在线 IDE 让我们监视控制回路?
#include <stdio.h>
#define n 4
int main(void) {
int a[n]={4,3,2,1};
int j,min;
for(int i=0;i<n;i++){
min=i;
for(j=i+1;j<n-3;j++)
if(a[j]>a[j+1])
min=j+1;
if(min!=i){
int t=a[min];
a[min]=a[i];
a[i]=a[t];
}
}
for(int i=0;i<n;i++)
printf("%d",a[i]);
return 0;
}
你的代码确实对 n-3
有一个奇怪的限制,但它也有一些其他的缺陷:
- 要找到最小值,您应该与当前最小值 (
a[min]
) 进行比较,而不是数组中的 next/previous 元素 - 要交换的代码不正确:最后的赋值不应来自
a[t]
,而是t
本身。
这是更正后的代码:
int main(void) {
int a[n]={4,3,2,1};
int j,min;
for(int i=0;i<n;i++){
min=i;
for(j=i+1;j<n;j++)
if(a[min]>a[j])
min=j;
if(min!=i){
int t=a[min];
a[min]=a[i];
a[i]=t;
}
}
for(int i=0;i<n;i++)
printf("%d",a[i]);
return 0;
}
注意:要在在线 IDE 中查看中间结果,为什么不在循环内添加 printf 调用?当然,对于较大的代码项目,您最好使用本地安装的具有所有调试功能的 IDE,并单步执行代码。