2013-04-14 3 views
0

Итак, я просто работаю над кодом C, в частности функцией, которая принимает 3 аргумента: массив, размер массива и количество возвращаемых максимальных элементов.C Max Numbers In Array Algorithm

Вот мой код:

int* findMaxElements(int base_array[],int size_of_base_array, int number_of_elements_to_find); 

int main(void) 
{ 

    printf("Find Max Values in an Array\n\n"); 

    // Set up array 

    int kinch[6] = {1,2,3,4,5,6}; 

    // Pass to function and get a pointer to new array filled with only the max elements 

    int *given = findMaxElements(kinch,6,3); 

    for(int i = 0; i < 3; i++) 
    { 
     printf("\nMax Value = %d\n", *(given + i)); 
    } 
    return 0; 

} 

int* findMaxElements(int base_array[],int size_of_base_array, int number_of_elements_to_find) 
{ 

    // Set up all initial variables 

    int i,k,c,position; 
    int maximum = 0; 



    int returnArray[100]; 

    /*Actual Algorythm */ 

    for(i = 0; i < number_of_elements_to_find; i++) 
    { 

     // Get the max value in the base array 

     for(k = 0; k < size_of_base_array; k++) 
     { 
      if(base_array[k] > maximum) 
      { 
       maximum = base_array[k]; 
      } 
     } 

     // Find the position of the max value 

     for(position = 0; position < size_of_base_array; position++) 
     { 

      if(base_array[position] == maximum) 
      { 
       break; 
      } 

     } 

     // Delete the maximum value from the array and shift everything 

     for(c = position - 1; c < size_of_base_array - 1; c++) 
     { 
      base_array[c] = base_array[c+1]; 
     } 

     // Reduce the size of the array 

     size_of_base_array -= 1; 

     // Push max value into return array 

     returnArray[i] = maximum; 

     // Reset max value 

     maximum = 0; 
    } 

    return returnArray; 

} 

У меня есть чувство где-то в функции что-то идет не так.

// Set up array 

    int kinch[6] = {1,2,3,4,5,6}; 

    // Pass to function and get a pointer to new array filled with only the max elements 

    int *given = findMaxElements(kinch,6,3); 

    for(int i = 0; i < 3; i++) 
    { 
     printf("\nMax Value = %d\n", *(given + i)); 
    } 

Это должно выводить номера 6, 5 и 4, потому что они являются тремя крупнейшими в массиве, однако выход я всегда 6, 6 и 6. Что случилось с ним?

ответ

2

Это не может быть вашей единственной проблемой, но в линиях

for(c = position - 1; c < size_of_base_array - 1; c++) 
    { 
     base_array[c] = base_array[c+1]; 
    } 

Вы копируете элемент в [c+1] (что является максимальным) для [c] - так что вы держите найти максимум ...

Вы должны начать цикл с c = position, а не c = position - 1.

И добавьте ключевое слово static перед массивом, используемым для хранения возвращаемых значений, чтобы они оставались действительными (это один из способов решения проблемы, которую идентифицировал Джонатан Леффлер).

+2

Переполнение массива также является проблемой. Я бы рекомендовал передать массив, чтобы получить возвращаемые значения. Использование массива 'static' - это, безусловно, решение с одним словом, которое« работает », но это означает, что вы не разрешаете повторному вводу кода. За один раз может выполняться только один вызов, и последний вызов «выигрывает». –

+1

@JonathanLeffler вы правы. Выделение массива из 100 элементов «просто для того, чтобы быть в безопасности», а не проверка того, что 'number_of_elements_to_find' меньше 100, является проблемой, ожидающей ее появления; Мне нравится решение иметь пространство, выделенное вызывающей процедурой. – Floris

+0

Спасибо, ребята. Я изменил код, и теперь он работает. Я также добавил дополнительный параметр к функции, которая сохранит максимальные значения и избавится от выделения из 100 элементов в локальном массиве. – turnt

2

Одна из проблем заключается в том, что вы возвращаете указатель на локальную переменную, returnArray, в функцию. Вы не можете сделать это надежно - это приводит к неопределенному поведению.

Также могут быть и другие проблемы, но этого достаточно, чтобы быть демонстрационной пробкой самостоятельно.

+1

+1 для нахождения этой проблемы - если вы не возражаете, я включил решение этого вопроса с моим «и ваш алгоритм перерывов здесь "ответьте (со ссылкой на ваш ответ). Не уверен, какой правильный этикет для этого. Если бы я не сделал этого, пожалуйста, дайте мне знать. – Floris

1

Весь подход, чтобы найти самый большой элемент Kth, не является эффективным и изящным. Я предлагаю вам изменить свой алгоритм, хотя с приведенными выше предложениями он будет работать нормально, но это не очень хороший способ решить эту проблему.

Я предлагаю вам взглянуть на ссылку ниже, чтобы изменить ваш алгоритм http://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/

+1

Я согласен, что это не отличный алгоритм, но я думаю, что это более «научиться программировать», чем упражнение «писать эффективный алгоритм». Полезная ссылка - я добавил ее в закладки! – Floris