根据最小值索引对数组进行排序?

时间:2015-10-15 08:52:14

标签: c arrays sorting

我目前正在尝试学习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,然后其余数字按顺序排列。有人看到这里有什么问题吗?

2 个答案:

答案 0 :(得分:0)

我认为您的return_index_of_minimum功能存在错误。

int index_to_return = 0;

问题在于我认为,如果您拨打index_to_returnreturn_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;
}