我目前正在尝试学习C,我在网上找到的练习让我创建了一个返回数组中最小值索引的函数。这是我的功能:
int return_index_of_minimum(int A[10], int i, int j){
int minimum_value = A[i];
int index_to_return = 0;
for (int index = i; index < j; index++){
if (A[index] < minimum_value){
minimum_value = A[index];
index_to_return = index;
}
}
return index_to_return;
}
i和j是函数应该查看的下限和上限数。例如,如果i为4且j为8,则表示函数将返回索引4和8之间的最小值的索引。 / p>
这是我的主要功能:
#include <stdio.h>
int main(){
int numbers[10];
int user_input = 0;
for (int i = 0; i < 10; i++){
printf("Please enter a number: ");
scanf_s("%d", &user_input);
numbers[i] = user_input;
}
for (int i = 0; i < 10; i++){
int index_of_min_value = return_index_of_minimum(numbers, i, 10);
int old_num = numbers[index_of_min_value];
int new_num = numbers[i];
numbers[index_of_min_value] = new_num;
new_array[i] = old_num;
}
for (int i = 0; i < 10; i++){
printf("%d\n", new_array[i]);
}
}
用户首先输入一组数字,然后使用用户的值填充数组。我们的想法是使用return_index_of_minimum
返回数组中最小项的索引,然后使用for循环将其设置为numbers[0]
,然后numbers[1]
,然后依此类推。 old_num
是数组中最低的数字,与之前的索引相同。在这里,我尝试将最小值与numbers[i]
处的任何值交换。然而,当我完成对整个阵列的排序并打印出来时,我看到10(当用户随机输入1-10值()为索引0,然后其余数字按顺序排列。有人看到这里有什么问题吗?
答案 0 :(得分:0)
我认为您的return_index_of_minimum
功能存在错误。
int index_to_return = 0;
问题在于我认为,如果您拨打index_to_return
,return_index_of_minimum(numbers, 5, 10);
的值将保持为0,如果是实际最低值,则numbers[5]
的值将保持为0.
但是,为什么不使用像实施here
那样的简单冒泡排序/*
* C program to sort N numbers in ascending order using Bubble sort
* and print both the given and the sorted array
*/
#include <stdio.h>
#define MAXSIZE 10
int main(void)
{
int array[MAXSIZE];
int i, j, num, temp;
printf("Enter the value of num \n");
scanf("%d", &num);
printf("Enter the elements one by one \n");
for (i = 0; i < num; i++)
{
scanf("%d", &array[i]);
}
printf("Input array is \n");
for (i = 0; i < num; i++)
{
printf("%d\n", array[i]);
}
/* Bubble sorting begins */
for (i = 0; i < num; i++)
{
for (j = 0; j < (num - i - 1); j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
printf("Sorted array is...\n");
for (i = 0; i < num; i++)
{
printf("%d\n", array[i]);
}
}
答案 1 :(得分:0)
这是一个修复:
int return_index_of_minimum(int A[10], int i, int j){
int minimum_value = A[i];
int index_to_return = i;
...
}
不幸的是,这段代码没有无效参数的保护,但是这是你一直在寻找的答案。
原因在于调用index_of_minimum(a, 9, 10)
:循环仅对index = 9
执行一次迭代,并且由于最小值已初始化为值a[9]
,因此index_to_return
为因条件检查而未更新。
这是一种不同的方法,没有相同的问题:
int return_index_of_minimum(int A[10], int i, int j){
/* assuming i < j */
int minimum_value = A[i];
int index_to_return = i; /* First element is a candidate */
for (int index = i + 1; index < j; index++){
/* Iterate from second element */
if (A[index] < minimum_value){
minimum_value = A[index];
index_to_return = index;
}
}
return index_to_return;
}