小彭同学犯过的傻逼错误:把前面排好序的数也拉进后面的数比较中
错误代码:
#include <stdio.h>
int main()//选择排序
{
int n,h,v;
printf("请输入数的个数:\n");
scanf("%d",&n);//输入数的个数
int a[n];
printf("请输入数:\n");
for(int s=0;s<n;s++)//输入n个数
{
scanf("%d",&a[s]);
}
for(int i=0;i<n-1;i++)//选择排序n-1次
{
int min=a[i];//每次定第一个为最小值
for(int j=1;j<=n-1;j++)//每次比较n-1次
{
min=min<a[j]?min:a[j];//求出后面部分的最小值
}
for(int g=0;g<n;g++)//确定后面部分的最小值的数组下标g
{
if(a[g]==min)
{
h=g;
break;
}
}
if(a[h]<a[i])//如果小就交换
{
v=a[h];
a[h]=a[i];
a[i]=v;
}
}
printf("执行选择排序算法后数列从小到大为:");
for(int k=0;k<n;k++)//输出从小到大排列的数
{
printf("%d ",a[k]);
}
printf("\n");
return 0;
}
错误代码的执行结果测试:
请输入数的个数:
6
请输入数:
1 4 8 0 3 11
执行选择排序算法后数列从小到大为:1 3 4 0 8 11
错误代码的调试代码:
#include <stdio.h>
int main()//选择排序
{
int n,h,v;
printf("请输入数的个数:\n");
scanf("%d",&n);//输入数的个数
int a[n];
printf("请输入数:\n");
for(int s=0;s<n;s++)//输入n个数
{
scanf("%d",&a[s]);
}
for(int i=0;i<n-1;i++)//选择排序n-1次
{
int min=a[i];//每次定第一个为最小值
for(int j=i+1;j<=n-1;j++)//每次比较n-1次
{
min=min<a[j]?min:a[j];//求出后面部分的最小值
}
for(int g=0;g<n;g++)//确定后面部分的最小值的数组下标g
{
if(a[g]==min)
{
h=g;
break;
}
}
if(a[h]<a[i])
{
v=a[h];
a[h]=a[i];
a[i]=v;
}
//调试段:
for(int k=0;k<n;k++)//输出从小到大排列的数
{
printf("%d ",a[k]);
}
printf("\n");//
}
printf("执行选择排序算法后数列从小到大为:");
for(int k=0;k<n;k++)//输出从小到大排列的数
{
printf("%d ",a[k]);
}
printf("\n");
return 0;
}
调试结果:
请输入数的个数:
5
请输入数:
2 4 1 0 5
0 4 1 2 5
0 1 4 2 5
0 4 1 2 5
0 4 2 1 5
执行选择排序算法后数列从小到大为:0 4 2 1 5
发现问题:第三次排序发生错误,因为把已排好的1放入后续的比较中了
解决问题:
修改代码:
#include <stdio.h>
int main()//选择排序
{
int n,h,v;
printf("请输入数的个数:\n");
scanf("%d",&n);//输入数的个数
int a[n];
printf("请输入数:\n");
for(int s=0;s<n;s++)//输入n个数
{
scanf("%d",&a[s]);
}
for(int i=0;i<n-1;i++)//选择排序n-1次
{
int min=a[i];//每次定第一个为最小值
for(int j=i+1;j<=n-1;j++)//每次比较n-1次(修改了这里)
{
min=min<a[j]?min:a[j];//求出后面部分的最小值
}
for(int g=0;g<n;g++)//确定后面部分的最小值的数组下标g
{
if(a[g]==min)
{
h=g;
break;
}
}
if(a[h]<a[i])
{
v=a[h];
a[h]=a[i];
a[i]=v;
}
//测试代码段
for(int k=0;k<n;k++)//输出从小到大排列的数
{
printf("%d ",a[k]);
}
printf("\n");//
}
printf("执行选择排序算法后数列从小到大为:");
for(int k=0;k<n;k++)//输出从小到大排列的数
{
printf("%d ",a[k]);
}
printf("\n");
return 0;
}
测试修改后的代码:
请输入数的个数:
5
请输入数:
2 4 1 0 5
0 4 1 2 5
0 1 4 2 5
0 1 2 4 5
0 1 2 4 5
执行选择排序算法后数列从小到大为:0 1 2 4 5
芜湖!!!完美解决!撒花~~~~~~
最终正确代码(删去了测试段的代码):
#include <stdio.h>
int main()//选择排序
{
int n,h,v;
printf("请输入数的个数:\n");
scanf("%d",&n);//输入数的个数
int a[n];
printf("请输入数:\n");
for(int s=0;s<n;s++)//输入n个数
{
scanf("%d",&a[s]);
}
for(int i=0;i<n-1;i++)//选择排序n-1次
{
int min=a[i];//每次定第一个为最小值
for(int j=i+1;j<=n-1;j++)//每次比较n-1次
{
min=min<a[j]?min:a[j];//求出后面部分的最小值
}
for(int g=0;g<n;g++)//确定后面部分的最小值的数组下标g
{
if(a[g]==min)
{
h=g;
break;
}
}
if(a[h]<a[i])
{
v=a[h];
a[h]=a[i];
a[i]=v;
}
}
printf("执行选择排序算法后数列从小到大为:");
for(int k=0;k<n;k++)//输出从小到大排列的数
{
printf("%d ",a[k]);
}
printf("\n");
return 0;
}
犯错犯的很好,但是下次不要再犯了!!!