2016-02-11 5 views
0

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

Спасибо.

class MainClass 
{ 

    public class List 
    { 

     public int maxSize = 50; 
     public int MaxSize 
     { 
      get 
      { 
       return maxSize; 
      } 
      set 
      { 
       maxSize = value; 
      } 
     } 


     public int firstEmpty = 0; 
     public int FirstEmpty 
     { 
      get 
      { 
       return firstEmpty; 
      } 
      set 
      { 
       firstEmpty = value; 
      } 
     } 

     public int[] data; 


     public List() 
     { 
      data = new int[maxSize]; 
     } 


     public int returnValueAtIndex(int i) 
     { 
      return data[i]; 
     } 


     public void setValueAtIndex(int v, int i) 
     { 
      data[i] = v; 
     } 

    } 



    public static int FIRST(List L) 
    { 
     if (END(L) > 0) 
      return 0; 
     else 
      return -1; 
    } 

    public static int END(List L) 
    { 
     return L.FirstEmpty; 
    } 

    public static int NEXT(int p, List L) 
    { 
     if (p >= 0 && p < L.MaxSize && p < END(L)) 
      return p+1; 
     else 
      return - 1; 
    } 

    public static int PREVIOUS(int p, List L) 
    { 
     if (p >= 0 && p < L.MaxSize && p <= END(L)) 
      return p-1; 
     else 
      return -1; 
    } 

    public static int LOCATE (int x, List L) 
    { 
     int i = 0; 
     while (i<END(L) && RETRIEVE(i, L) != x) 
     { 
      i++; 
     } 
     if (i != END(L)) 
      return i; 
     else 
      return -1; 
    } 

    public static int RETRIEVE(int p, List L) 
    { 
     if (p >= 0 && p < END(L)) 
      return L.returnValueAtIndex(p); 
     else 
      return -1; 
    } 

    public static void INSERT(int x, int p, List L) 
    { 
     if (p >= 0 && p < L.MaxSize && p <= END(L)) 
     { 
      if (p == END(L)) 
      { 
       L.setValueAtIndex(x, p); 
      } 
      else 
      { 
       for (int i = END(L); i > p; i--) 
       { 
        L.setValueAtIndex(L.returnValueAtIndex(i - 1), i); 
        L.setValueAtIndex(x, p); 
       } 
      } 
      L.FirstEmpty = END(L) + 1; 
     } 
     else 
      Console.WriteLine("Alkiota ei voitu lisätä"); 
    } 

    public void DELETE(int p, List L) 
    { 
     if (p >= 0 && p < END(L)) 
     { 
      for (int i = p; i < p - 1; i++) 
      { 
       L.setValueAtIndex(L.returnValueAtIndex(i + 1), i); 
      } 
      L.FirstEmpty = END(L) - 1; 
     } 

    } 
    public void MAKENULL(List L) 
    { 
     L.FirstEmpty = 0; 
    } 

    public static void PRINT(List L) 
    { 
     Console.WriteLine("Listan sisältö:"); 
     for (int i = 0; i < END(L); i++) 
     { 
      Console.Write(L.returnValueAtIndex(i) + " "); 
     } 
     Console.WriteLine(); 
    } 





    public static void Main(string[] args) 
    { 

     List testilista = new List(); 
     INSERT(2, END(testilista), testilista); 
     INSERT(7, END(testilista), testilista); 
     INSERT(9, END(testilista), testilista); 
     INSERT(12, END(testilista), testilista); 
     INSERT(9, END(testilista), testilista); 
     INSERT(38, END(testilista), testilista); 


     Console.WriteLine("testilista"); 
     PRINT(testilista); 



     Console.ReadLine(); 


    } 
} 

}

+0

Какой язык это? – Kevin

+0

C# - это язык –

+1

В частности, с чем вы сталкиваетесь? –

ответ

1

Примечание: Ответ не является специфичным для C#

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

var unorderedList = [5,4,3,2,6,7,-23,8,-64,2,0,6]; 

function findSmallest(anArray){ 
    var lowest = anArray[0]; 
    for(var i = 1; i < anArray.length; i++){ 
     var num = anArray[i]; 
     if(num < lowest){ 
      lowest = num; 
     } 
    } 

    return lowest; 
} 

var smallest = findSmallest(unorderedList); 

console.log(smallest); //prints -64 

Вы можете запустить код here

хит кнопку запуска

0

Я не думаю, что это лучший вариант. Для меня есть два пути.

Упорядочить свой список по этому коду.

int valueMin = L.returnValueAtIndex(0); 

for (int i = 0; i < END(L); i++) 
{ 
    //if the value of i is smaller than the value 
    if (valueMin < L.returnValueAtIndex(i)) 
    { 
     //i become the min Value 
     valueMin = L.returnValueAtIndex(i); 
    } 
} 

Console.WriteLine(valueMin); 
Console.Read(); 

Или в C# вы можете использовать Array.sort

Array.Sort(L); 
Console.WriteLine(L.returnValueAtIndex(0)); 
Console.Read(); 

Я надеюсь, что это поможет!

+0

Помогает. Спасибо .. –

+0

Сортировка массива медленнее, чем просто поиск каждого значения в массиве один раз, и так как он ищет «самый эффективный способ», это хуже, чем ответ Габса. –

+0

Я сказал: «Я не думаю, что это это лучший вариант », извините, если я новичок. Это лучше? int [] list = {6, 9, 8, 2}; int minValue = list.Min(); – Mirouf

1

Самый простой способ сделать это в C# это с Linq:

var minValue = data.Min(); 

, если вы хотите, самое высокое значение:

var maxValue = data.Max(); 
+0

Я просто попробовал его в приложении форм C#, прежде чем публиковать его здесь, и я получил min-значение из своего массива, не отбрасывая его в списке. –

+1

Вы совершенно правы, моя ошибка, я неправильно помню, какие классы могли использовать 'Min()', я удалю свой комментарий, так как это неточно –

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