2015-10-15 13 views
1

В настоящее время я пытаюсь изучить 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; 
} 

я и J являются нижняя и верхняя граница числа функция должна выглядеть в Например, если я это 4 и J является 8, что означает, что функция будет возвращать индекс наименьшее значение между индексами 4 и 8.

Вот моя главная функция:

#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, чтобы вернуть индекс наименьшего элемента в массив, а затем установить равным numbers[0] с циклом for, а затем numbers[1], а затем и так далее. old_num - это самое низкое число в массиве по его предыдущему индексу. Здесь я пытаюсь заменить это минимальное значение на numbers[i] Однако, когда я закончил сортировку по всему массиву и распечатаю его, я вижу, что 10 (когда пользователь вводит 1-10 случайным образом для значений) находится в индексе 0, а затем остальные числа находятся в порядке. Кто-нибудь видит, что здесь не так?

+1

время, чтобы узнать, как использовать отладчик. С помощью отладчика вы можете проходить код за строкой, контролируя переменные и их значения. Это поможет вам понять, что делает какая-то часть кода * на самом деле. :) –

+4

ваша функция 'return_index_of_minimum' не работает, если первое значение является минимальным, а' i' не '0'. Измените 'int index_to_return = 0;' на 'int index_to_return = i;'. – mch

+0

Прошу прощения, я не совсем вижу ошибку, которую вы видите. 'int index_to_return = 0' на самом деле просто для инициализации переменной (если это не требуется). Если первое значение является минимальным, то не будет ли цикл полностью обходить оператор if и возвращать индекс в 0? – MistFTW

ответ

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; 
} 
0

Я считаю, что в вашей функции return_index_of_minimum есть ошибка.

int index_to_return = 0; 

Проблема заключается я думаю, что здесь в качестве значения index_to_return останется 0, если вы звоните return_index_of_minimum(numbers, 5, 10); и numbers[5] если фактический минимум.

Однако почему бы не использовать простой пузырьковой сортировки, как один реализован 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

он должен быть 'int main (void)', а не 'void main()'. – mch

+0

Спасибо, извините за опечатку – LBes

Смежные вопросы