Как получить второе по величине число в массиве в Visual C #? - PullRequest
3 голосов
/ 28 ноября 2009

У меня есть массив целых. Я хочу получить второе по величине число в этом массиве. Есть ли простой способ сделать это?

Ответы [ 9 ]

16 голосов
/ 28 ноября 2009

Попробуйте это (используя LINQ):

int secondHighest = (from number in numbers
                     orderby number descending
                     select number).Skip(1).First();
15 голосов
/ 28 ноября 2009

Вы можете отсортировать массив и выбрать элемент по второму индексу, но следующий цикл O (n) будет намного быстрее.

int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 };
int largest = int.MinValue;
int second = int.MinValue;
foreach (int i in myArray)
{
    if (i > largest)
    {
        second = largest;
        largest = i;
    }
    else if (i > second)
        second = i;
}

System.Console.WriteLine(second);
4 голосов
/ 28 ноября 2009

Да, есть 2 переменные (первая и вторая), проходящие через массив, и каждый раз сравнивайте то, что вы получаете с этими двумя ячейками (всегда ставьте самое высокое в первую и второе самое высокое во вторую) с одним проходом вы получите 2-й выше на второй вар.

2 голосов
/ 28 ноября 2009

Вы не указываете, хотите ли вы сделать это с минимальной сложностью.

Если ваш массив не отсортирован, см .: Как найти k-й по величине элемент в несортированном массиве длиныn в O (n)?

Чтобы найти K-й по величине элемент в несортированном массиве: создайте максимальную кучу в O (n).Теперь удалите k элементов из кучи;где каждое удаление стоит log (n) времени на поддержание кучи.Общая сложность времени = O (n + klogn)

Чтобы понять, как построить максимальную кучу в O (n), см. Двоичная куча

1 голос
/ 07 апреля 2015

Получив максимальное число первым, после изменения максимума сделайте сравнение со вторым большим числом, чтобы увидеть, нужно ли его поменять местами. Второй оператор if проверяет, является ли значение меньше максимального и больше второго наибольшего значения. Из-за короткого замыкания, если первое условие не выполняется, оно выходит из if и пропускает

    static void Main(string[] args)
    {
        //int[] arr = new int[10] { 9, 4, 6, 2, 11, 100, 53, 23, 72, 81 };
        int[] arr = { 1, 8, 4, 5, 12, 2, 5, 6, 7, 1, 90, 100, 56, 8, 34 };
        int MaxNum = 0;
        int SecNum = 0;
        for (int i = 0; i < arr.Length; i++)
        {
            if (arr[i] > MaxNum)
            {
                if (MaxNum > SecNum) { SecNum = MaxNum; }
                MaxNum = arr[i];
            }

            if (arr[i] < MaxNum && arr[i] > SecNum)
            {
                SecNum = arr[i];
            }
        }

        Console.WriteLine("Highest Num: {0}. Second Highest Num {1}.", MaxNum, SecNum);
        Console.ReadLine();
    }
1 голос
/ 19 апреля 2013
max1=0;
max2=0;

for( int i=0; i < a.Length; i++)
{
    if (arr[i]> max1)
    {
        max2=max1;
        max1=arr[i];
    }
    else
    {
       if (a[i]!= max1) && ( a[i] > max2)
          max2[i]=arr[i];
    }
}
0 голосов
/ 13 августа 2014
    static void Main(string[] args)
    {
        int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5,12,11,14 };
        int num1 = 0, temp = 0;
        for (int i = 0; i < myArray.Length; i++)
        {
            if (myArray[i] >= num1)
            {
                temp = num1;
                num1 = myArray[i];
            }
            else if ((myArray[i] < num1) && (myArray[i] > temp))
            {
                temp = myArray[i];
            }
        }
        Console.WriteLine("The Largest Number is: " + num1);
        Console.WriteLine("The Second Highest Number is: " + temp);
        Console.ReadKey();
    }
0 голосов
/ 09 июня 2012
int[] arr = { 1, 8, 4, 5, 12, 2, 5, 6, 7, 1, 90, 100, 56, 8, 34 };

int first, second;
// Assuming the array has at least one element:
first = second = arr[0];
for(int i = 1; i < arr.Length; ++i)
{
  if (first < arr[i])
  {
    // 'first' now contains the 2nd largest number encountered thus far:
    second = first;
    first = arr[i];
  }

}
MessageBox.Show(second.ToString());
0 голосов
/ 06 апреля 2012
    int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 };
    int num1=0, temp=0;
    for (int i = 0; i < myArray.Length; i++)
    {
        if (myArray[i] >= num1)
        {
            num1 = myArray[i];
        }
        else if ((myArray[i] < num1) && (myArray[i] > temp))
        {
            temp = myArray[i];
        }
    }
    Console.WriteLine("The Largest Number is: " + num1);
    Console.WriteLine("The Second Highest Number is: " + temp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...