#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,n,min,j;
int *array;
printf("The no of elements >> ");
scanf("%d\n",&n);
printf("Making array\n" );
array = (int *)malloc (sizeof(int) * n);
printf("array made!\n");
//INPUT NUMBERS
for (i=0 ; i<n ; i++)
{
printf(">>Enter the element %d\n" , i+1);
scanf("%d\n", &array[i]);
}
//SORT THE ARRAY
for (i = 0; i < n; ++i)
{
min = array[0];
for (int j = i+1; j < n; ++j)
{
if (array[i] > array[j])
min = array[j];
}
if (min != array[i])
{
int temp;
temp = array[i];
array[i]= min;
array[j]=temp;
}
}
//PRINTING ARRAY
for (i=0 ; i<n ; i++)
{
printf("-- %d --\n" , array[i]);
};
}
我使用Malloc for arrays在c中使用了SelectionSort的这个特殊代码。但是,在“没有元素&gt;&gt;”之后进入2次输入。也不会排序。 如果我按照它的方式继续下去,它会以下列方式给我一个未排序的数组
The no of elements >> 5
4
Making array
array made!
>>Enter the element 1
5
>>Enter the element 2
2
>>Enter the element 3
1
>>Enter the element 4
7
>>Enter the element 5
8
-- 7 --
-- 1 --
-- 1 --
-- 2 --
-- 1 --
我已阅读其他一些帖子并更正了我的代码,但这仍然无效。 无法弄清楚原因。
编辑1 通过对代码进行一些更改,解决了双输入问题。
int main()
{ int i,n,min,j;
int *array;
printf("The no of elements >> ");
scanf("%d",&n);
array = (int *)malloc (sizeof(int) * n);
for (i=0 ; i<n ; i++)
{
printf(">>Enter the element %d\n" , i+1);
scanf("%d", &array[i]);
}
//SORT THE ARRAY
for (i = 0; i < n; ++i)
{
min = array[i];
for (int j = i+1; j < n; ++j)
{
if (array[i] > array[j])
min = array[j];
}
if (min != array[i])
{
int temp;
temp = array[i];
array[i]= min;
array[j]=temp;
}
}
//PRINTING ARRAY
for (i=0 ; i<n ; i++)
{
printf("-- %d --\n" , array[i]);
};
}
然而,现在输入仍然不正确
The no of elements >> 5
Making array
array made!
>>Enter the element 1
5
>>Enter the element 2
4
>>Enter the element 3
6
>>Enter the element 4
9
>>Enter the element 5
2
-- 9 --
-- 2 --
-- 2 --
-- 2 --
-- 2 --
编辑2 经过一些修正后,最终代码的错误仍然很少,我在
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n,min,j;
int *array;
printf("The no of elements >> ");
scanf("%d",&n);
printf("Making array\n" );
array = (int *)malloc (sizeof(int) * n);
printf("array made!\n");
//INPUT NUMBERS
for (i=0 ; i<n ; i++)
{
printf(">>Enter the element %d\n" , i+1);
scanf("%d", &array[i]);
}
//SORT THE ARRAY
for (i = 0; i < n; i++)
{
min = i;
for ( j = i+1; j < n; j++)
{
if (array[j] < array[i])
min = j;
}
if (min != i)
{
int temp;
temp = array[i];
array[i]= array[min];
array[min]=temp;
}
}
//PRINTING ARRAY
for (i=0 ; i<n ; i++)
{
printf("-- %d --\n" , array[i]);
};
}
导致一个有点排序,仍然不正确的数组
The no of elements >> 5
Making array
array made!
>>Enter the element 1
4
>>Enter the element 2
5
>>Enter the element 3
2
>>Enter the element 4
1
>>Enter the element 5
7
-- 1 --
-- 4 --
-- 2 --
-- 5 --
-- 7 --
编辑3:最终代码 我多次编辑代码进行点击和试用。我终于发现这段代码正常工作。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n,min,j;
int *array;
printf("The no of elements >> ");
scanf("%d",&n);
printf("Making array\n" );
array = (int *)malloc (sizeof(int) * n);
printf("array made!\n");
//INPUT NUMBERS
for (i=0 ; i<n ; i++)
{
printf(">>Enter the element %d\n" , i+1);
scanf("%d", &array[i]);
}
//SORT THE ARRAY
for (i = 0; i < n; ++i)
{
min = i;
for ( j = i+1; j < n; ++j)
{
if (array[j] < array[min])
min = j;
}
if (min != i)
{
int temp;
temp = array[i];
array[i]= array[min];
array[min]=temp;
}
}
//PRINTING ARRAY
for (i=0 ; i<n ; i++)
{
printf("-- %d --\n" , array[i]);
};
}
但是我仍然有兴趣知道为什么++ i / ++ j分别与i ++ / j ++相比毫无差别。
答案 0 :(得分:2)
应该是:
scanf("%d",&n);
NOT:
scanf("%d\n",&n);
修改强>:
在外部for循环中,它应该是min = array[i];
。
答案 1 :(得分:1)
编辑后,您的代码还有两个问题。
中间循环内的j
遮蔽了函数顶部声明的j
。因此,虽然内部for循环可能找到要交换的正确索引,但在内循环结束后该信息将丢失。
更改:
for (int j = i+1; j < n; ++j)
到:
for (j = i+1; j < n; ++j)
其次,您不应该跟踪最小元素的值。相反,您应该跟踪其索引。内部循环后j
始终等于n
,因此您的代码将为数组的每个元素分配最小元素。
变化:
min = array[i];
// ...
min = array[j];
// ...
if (min != array[i])
// ...
array[i]=min;
array[j]=temp;
为:
min = i;
// ...
min = j;
// ...
if (min != i)
// ...
array[i]=array[min];
array[min]=temp;
答案 2 :(得分:0)
我认为它应该是min = array[i];
而不是min = array[0];
答案 3 :(得分:0)
In,scanf(“%d \ n”,&amp; n); '\ n'告诉scanf读取但不保存。因此它等待读取非空白字符。