当我运行代码时,我得到了结果7215
,这显然是不正确的。代码很好,终端没有错误只输出错误。请帮助我知道这是一个基本的排序算法,但我是编程新手。
#include<stdio.h>
#include<stdlib.h>
void sort(int arr[],int n);
int main()
{
int a[]={2,7,1,5};
sort(a,4);
return 0;
}
void sort(int arr[],int n)
{
int i,j,temp;
int imin;
for(int i=0;i<(n-2);i++)
{
imin=i;
for(int j=0;j<n;j++)
{
if(arr[j]<arr[imin])
{
imin=j;
}
}
temp=arr[i];
arr[i]=arr[imin];
arr[imin]=temp;
}
int k;
for(k=0;k<n;k++)
{
printf("\n%d\n",arr[k]);
}
}
答案 0 :(得分:3)
这里有两个错误:
for(int i=0;i<(n-2);i++)
为什么-2
?你错过了以这种方式比较最后的元素,应该是-1
。 parantheses是不必要的,但添加一些空格,以使其可读:
for (int i = 0; i < n-1; i++)
然后,下一个循环也是错误的:
for(int j=0;j<n;j++)
再次从0开始,与已排序的内容进行比较并销毁它。将其更改为:
for (int j = i+1; j < n; j++)
对于这样的问题,你应该真正阅读How to debug small programs。橡皮鸭会帮助你。
答案 1 :(得分:0)
你犯了一些愚蠢的错误,选择排序算法就像这样::
选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序。该算法在给定数组中维护两个子数组。
1)已经排序的子阵列。 2)未分类的剩余子阵列。
在每次选择排序的迭代中,挑选来自未排序子阵列的最小元素(考虑升序)并移动到已排序的子阵列。
arr [] = 64 25 12 22 11
//找到arr [0 ... 4]中的最小元素 //并将其放在开头 11 25 12 22 64
//找到arr [1 ... 4]中的最小元素 //并将其放在arr [1 ... 4]的开头 11 12 25 22 64
//找到arr [2 ... 4]中的最小元素 //并将其放在arr [2 ... 4]的开头 11 12 22 25 64
//找到arr [3 ... 4]中的最小元素 //并将其放在arr [3 ... 4]的开头 11 12 22 25 64
所以你的代码应该是这样:::
#include<stdio.h>
#include<stdlib.h>
void sort(int arr[],int n);
int main()
{
int a[]={2,7,1,5};
sort(a,4);
return 0;
}
void sort(int arr[],int n)
{
int i,j,temp;
int imin;
for(int i=0;i<(n-1);i++)
{
imin=i;
for(int j=i+1;j<n;j++)
{
if(arr[j]<arr[imin])
{
imin=j;
}
}
temp=arr[i];
arr[i]=arr[imin];
arr[imin]=temp;
}
int k;
for(k=0;k<n;k++)
{
printf("\n%d\n",arr[k]);
}
}