Как найти несколько минимальных элементов массива

Найти два наименьших (минимальных) элемента массива

Просмотров 7.6к. Обновлено 15 октября 2021

В одномерном массиве целых чисел определить два наименьших элемента. Они могут быть как равны между собой (оба являться минимальными), так и различаться.

Сначала можно найти минимальный элемент массива. После этого искать второй минимум, исключив их поиска первый с помощью if. Данный способ рассматривается здесь по отношению к двум наибольшим элементам.

Сложнее задачу решить, используя один цикл перебора.

Предположим, что двумя наименьшими элементами массива являются первый и второй элемент. Присвоим их индексы переменным m1 и m2. При этом, если первый элемент меньше второго, то его индекс присвоим m1, иначе m1 получит значение второго элемента, а m2 первого.

Начнем перебирать массив в цикле, начиная с третьего элемента. Если он меньше элемента, чей индекс хранится в m1, то присвоим индекс текущего элемента m1. Иначе (если значение по индексу m1 меньше, чем по индексу i) будем проверять, не меньше ли значение по индексу i, того что по индексу m2.

Есть один не очевидный нюанс. Допустим, в m1 указывало на значение 5, а m2 — на 10. Очередной элемент равен 3. Мы меняем m1, и забываем о числе 5. Однако оно может оказаться как раз вторым минимумом массива.

Поэтому в программе при изменении значения m1 надо предусмотреть проверку, не меньше ли теряемое значение, чем то, что хранится по индексу m2.

Pascal


const
N = 10;
var
a: array[1..N] of integer;
i, min1, min2, buff: byte;
begin
randomize;
for i:=1 to N do begin
a[i] := random(100);
write(a[i]:4);
end;
writeln;

if a[1] < a[2] then begin
min1 := 1;
min2 := 2;
end
else begin
min1 := 2;
min2 := 1;
end;

for i:=3 to N do
if a[i] < a[min1] then begin
buff := min1;
min1 := i;
if a[buff] < a[min2] then
min2 := buff;
end
else
if a[i] < a[min2] then
min2 := i;

writeln('№', min1:2,': ', a[min1]:2);
writeln('№', min2:2,': ', a[min2]:2);
end.



8 66 40 40 0 14 50 74 93 71
№ 5: 0
№ 1: 8

Язык Си


#include < stdio.h>
#define N 10
main() {
int a[N];
int i, min1, min2, buff;
srand(time(NULL));
for (i=0; i< N; i++) {
a[i] = rand() % 100;
printf("%3d", a[i]);
}
printf("n");

if (a[0] < a[1]) {
min1 = 0;
min2 = 1;
} else {
min1 = 1;
min2 = 0;
}

for (i=2; i< N; i++) {
if (a[i] < a[min1]) {
buff = min1;
min1 = i;
if (a[buff] < a[min2]) min2 = buff;
} else {
if (a[i] < a[min2]) min2 = i;
}
}

printf("№%2d:%3dn",min1+1,a[min1]);
printf("№%2d:%3dn",min2+1,a[min2]);
}



97 20 88 29 20 43 87 19 33 26
№ 8: 19
№ 5: 20

Python

найти два минимальных элемента массива python


from random import random
N = 10
a = []
for i in range(N):
a.append(int(random()*100))
print("%3d" % a[i], end='')
print()

if a[0] > a[1]:
min1 = 0
min2 = 1
else:
min1 = 1
min2 = 0

for i in range(2,N):
if a[i] < a[min1]:
b = min1
min1 = i
if a[b] < a[min2]:
min2 = b
elif a[i] < a[min2]:
min2 = i

print("№%3d:%3d" % (min1+1, a[min1]))
print("№%3d:%3d" % (min2+1, a[min2]))

# Вариант 2

from random import randint

array = [randint(1, 20) for i in range(10)]
print(array)

min1 = min(array)
array.remove(min1)
min2 = min(array)

print(min1)
print(min2)



14 3 40 56 42 43 89 69 64 72
№ 1: 14
№ 2: 3

КуМир


алг два минимальных
нач
цел N = 10
цел таб arr[1:N]
цел i,m1,m2,b
нц для i от 1 до N
arr[i] := irand(10,100)
вывод arr[i]:3
кц
вывод нс

если arr[1] < arr[2] то
m1 := 1
m2 := 2
иначе
m1 := 2
m2 := 1
все

нц для i от 3 до N
если arr[i] < arr[m1] то
b := m1
m1 := i
если arr[b] < arr[m2] то
m2 := b
все
иначе
если arr[i] < arr[m2] то
m2 := i
все
все
кц
вывод "№",m1:2,":",arr[m1]:3,нс
вывод "№",m2:2,":",arr[m2]:3,нс
кон



65 32 24 86 65 58 67 55 33 96
№ 3: 24
№ 2: 32

Basic-256


N = 10
dim arr(N)
for i=0 to N-1
arr[i] = int(rand*100)
print arr[i] + " ";
next i
print

if arr[0] < arr[1] then
m1 = 0
m2 = 1
else
m1 = 1
m2 = 0
endif

for i=2 to N-1
if arr[i] < arr[m1] then
b = m1
m1 = i
if arr[b] < arr[m2] then
m2 = b
endif
else
if arr[i] < arr[m2] then
m2 = i
endif
endif
next i

print (m1+1) + ": " + arr[m1]
print (m2+1) + ": " + arr[m2]



81 7 25 71 23 9 56 91 73 64
2: 7
6: 9

Необходимо найти два min значения в массиве случайных числе.
Код написан под swift.

var list = [Int] ()
var n: Int = 8

for i in 1...n
{
   let list = Int(arc4random_uniform(70))
   print (list)
}

func getMin1Min2(numbers:Int...) -> (min1:Int, min2:Int)
{
var min1 = numbers[0]
var min2 = numbers[0]

for number in numbers
{
if number < min1 {min1 = number}

Дальше попытка найти 2-ое минимальное значение, но увы

if number > min1
        {if number < min2
            {min2 = number}
        }
}
return (min1, min2)
}

завершаться задача должна поиском двух мин. значений в рандомном массиве, но увы не знаю как использовать созданный массив и функцию …

var value = getMin1Min2 (list)

задан 28 мая 2016 в 18:08

mrSpaceDandy's user avatar

1

Для начала, Вы не заполняете массив. Вот создаете массив:

let n = 8
var arr = [Int]()
for _ in 0..<n {
    arr.append(Int(arc4random_uniform(70)))
}
print(arr)

Далее ищете 2 минимальных элемента в массиве, предлагаю просто отсортировать массив по возрастанию и возвращать первые 2 элемента:

func getMin1Min2(numbers:[Int]) -> (min1:Int, min2:Int){
    let sortedNumbers = numbers.sort({$0 < $1})
    return sortedNumbers.count > 1 ? (sortedNumbers[0], sortedNumbers[1]) : (sortedNumbers[0], sortedNumbers[0])
}

И проверка:

print(getMin1Min2(arr))

ответ дан 29 мая 2016 в 5:05

VAndrJ's user avatar

VAndrJVAndrJ

15.8k1 золотой знак18 серебряных знаков35 бронзовых знаков

Вариант 1: сделай копию массива, найди в нем минимум и удали его. Потом найди минимум еще раз.
Для не очень больших массивов подойдет.

Вариант 2: находишь первый минимум (запоминаешь его индекс).
Еще раз ищешь минимум в массиве, но уже не сравниваешь элемент с найденным индексом.

var myMin = MAX_INT
for i in 0..myArray.count {
    if (myArray[i] < myMin && i != indexOfFirstMin ){
        myMin = myArray[i]
    }
}

Denis's user avatar

Denis

8,86010 золотых знаков30 серебряных знаков55 бронзовых знаков

ответ дан 14 июн 2016 в 12:18

Валентин's user avatar

ВалентинВалентин

1,1056 серебряных знаков6 бронзовых знаков

0

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Find the first, second and third minimum elements in an array in O(n).

    Examples: 

    Input : 9 4 12 6
    Output : First min = 4
             Second min = 6
             Third min = 9
    
    Input : 4 9 1 32 12
    Output : First min = 1
             Second min = 4
             Third min = 9

    First approach : First we can use normal method that is sort the array and then print first, second and third element of the array. Time complexity of this solution is O(n Log n).

    C++

    #include<bits/stdc++.h>

    using namespace std;

    int Print3Smallest(int array[], int n)

    {

        sort(array,array+n);

        cout << "First min = " << array[0] << "n";

        cout << "Second min = " << array[1] << "n";

        cout << "Third min = " << array[2] << "n";

    }

    int main()

    {

        int array[] = {4, 9, 1, 32, 12};

        int n = sizeof(array) / sizeof(array[0]);

        Print3Smallest(array, n);

        return 0;

    }

    Java

    import java.util.Arrays;

    public class Main {

      static void Print3Smallest(int array[], int n) {

      Arrays.sort(array);

          System.out.println("First min = " + array[0]);

          System.out.println("Second min = " + array[1]);

          System.out.println("Third min = " + array[2]);

      }

      public static void main(String[] args) {

          int array[] = {4, 9, 1, 32, 12};

          int n = array.length;

          Print3Smallest(array, n);

      }

    }

    Python3

    def print_3_smallest(array):

        array.sort()

        print("First min =", array[0])

        print("Second min =", array[1])

        print("Third min =", array[2])

    if __name__ == '__main__':

        array = [4, 9, 1, 32, 12]

        n = len(array)

        print_3_smallest(array)

    C#

    using System;

    using System.Linq;

    class Program

    {

        static void Print3Smallest(int[] array, int n)

        {

            Array.Sort(array);

            Console.WriteLine("First min = " + array[0]);

            Console.WriteLine("Second min = " + array[1]);

            Console.WriteLine("Third min = " + array[2]);

        }

        static void Main()

        {

            int[] array = {4, 9, 1, 32, 12};

            int n = array.Length;

            Print3Smallest(array, n);

        }

    }

    Javascript

    function Print3Smallest(array,n){

        array.sort((a, b) => a - b);

        console.log('First min = ' + array[0]);

        console.log('Second min = ' + array[1]);

        console.log('Third min = ' + array[2]);

    }

    let array = [4, 9, 1, 32, 12];

    Print3Smallest(array,array.length);

    Output

    First min = 1
    Second min = 4
    Third min = 9

    Second approach : Time complexity of this solution is O(n).

    Algorithm:

    • First take an element
    • then if array[index] < Firstelement
      • Thirdelement = Secondelement
      • Secondelement = Firstelement
      • Firstelement = array[index]
    •      else if array[index] < Secondelement
      •   Thirdelement = Secondelement
      •  Secondelement = array[index]
    •      else if array[index] < Thirdelement
      • Thirdelement = array[index]
    • then print all the element 

    Implementation:

    C++

    #include<bits/stdc++.h>

    #define MAX 100000

    using namespace std;

    int Print3Smallest(int array[], int n)

    {

        int firstmin = MAX, secmin = MAX, thirdmin = MAX;

        for (int i = 0; i < n; i++)

        {

            if (array[i] < firstmin)

            {

                thirdmin = secmin;

                secmin = firstmin;

                firstmin = array[i];

            }

            else if (array[i] < secmin)

            {

                thirdmin = secmin;

                secmin = array[i];

            }

            else if (array[i] < thirdmin)

                thirdmin = array[i];

        }

        cout << "First min = " << firstmin << "n";

        cout << "Second min = " << secmin << "n";

        cout << "Third min = " << thirdmin << "n";

    }

    int main()

    {

        int array[] = {4, 9, 1, 32, 12};

        int n = sizeof(array) / sizeof(array[0]);

        Print3Smallest(array, n);

        return 0;

    }

    Java

    import java.util.*;

    public class GFG

    {

        static void Print3Smallest(int array[], int n)

        {

                int firstmin = Integer.MAX_VALUE;

                int secmin = Integer.MAX_VALUE;

                int thirdmin = Integer.MAX_VALUE;

                for (int i = 0; i < n; i++)

                {

                    if (array[i] < firstmin)

                    {

                        thirdmin = secmin;

                        secmin = firstmin;

                        firstmin = array[i];

                    }

                    else if (array[i] < secmin)

                    {

                        thirdmin = secmin;

                        secmin = array[i];

                    }

                    else if (array[i] < thirdmin)

                        thirdmin = array[i];

                }

                System.out.println("First min = " + firstmin );

                System.out.println("Second min = " + secmin );

                System.out.println("Third min = " + thirdmin );

        }

        public static void main(String[] args)

        {

                int array[] = {4, 9, 1, 32, 12};

                int n = array.length;

                Print3Smallest(array, n);

        }

    }

    Python3

    MAX = 100000

    def Print3Smallest(arr, n):

        firstmin = MAX

        secmin = MAX

        thirdmin = MAX

        for i in range(0, n):

            if arr[i] < firstmin:

                thirdmin = secmin

                secmin = firstmin

                firstmin = arr[i]

            elif arr[i] < secmin:

                thirdmin = secmin

                secmin = arr[i]

            elif arr[i] < thirdmin:

                thirdmin = arr[i]

        print("First min = ", firstmin)

        print("Second min = ", secmin)

        print("Third min = ", thirdmin)

    arr = [4, 9, 1, 32, 12]

    n = len(arr)

    Print3Smallest(arr, n)

    C#

    using System;

    class GFG

    {

    static void Print3Smallest(int []array, int n)

        {

                int firstmin = int.MaxValue;

                int secmin = int.MaxValue;

                int thirdmin = int.MaxValue;

                for (int i = 0; i < n; i++)

                {

                    if (array[i] < firstmin)

                    {

                        thirdmin = secmin;

                        secmin = firstmin;

                        firstmin = array[i];

                    }

                    else if (array[i] < secmin)

                    {

                        thirdmin = secmin;

                        secmin = array[i];

                    }

                    else if (array[i] < thirdmin)

                        thirdmin = array[i];

                }

                Console.WriteLine("First min = " + firstmin );

                Console.WriteLine("Second min = " + secmin );

                Console.WriteLine("Third min = " + thirdmin );

        }

        static void Main()

        {

        int []array = new int[]{4, 9, 1, 32, 12};

        int n = array.Length;

        Print3Smallest(array, n);

        }

    }

    PHP

    <?php

    function Print3Smallest($array, $n)

    {

        $MAX = 100000;

        $firstmin = $MAX;

        $secmin = $MAX;

        $thirdmin = $MAX;

        for ($i = 0; $i < $n; $i++)

        {

            if ($array[$i] < $firstmin)

            {

                $thirdmin = $secmin;

                $secmin = $firstmin;

                $firstmin = $array[$i];

            }

            else if ($array[$i] < $secmin)

            {

                $thirdmin = $secmin;

                $secmin = $array[$i];

            }

            else if ($array[$i] < $thirdmin)

                $thirdmin = $array[$i];

        }

        echo "First min = ".$firstmin."n";

        echo "Second min = ".$secmin."n";

        echo "Third min = ".$thirdmin."n";

    }

        $array= array(4, 9, 1, 32, 12);

        $n = sizeof($array) / sizeof($array[0]);

        Print3Smallest($array, $n);

    ?>

    Javascript

    <script>

    let MAX = 100000

    function Print3Smallest( array,  n)

    {

        let firstmin = MAX, secmin = MAX, thirdmin = MAX;

        for (let i = 0; i < n; i++)

        {

            if (array[i] < firstmin)

            {

                thirdmin = secmin;

                secmin = firstmin;

                firstmin = array[i];

            }

            else if (array[i] < secmin)

            {

                thirdmin = secmin;

                secmin = array[i];

            }

            else if (array[i] < thirdmin)

                thirdmin = array[i];

        }

        document.write("First min = " + firstmin + "</br>");

        document.write("Second min = " + secmin + "</br>");

        document.write("Third min = " + thirdmin + "</br>");

    }

        let array = [4, 9, 1, 32, 12];

        let n = array.length;

        Print3Smallest(array, n);

    </script>

    Output

    First min = 1
    Second min = 4
    Third min = 9

    Time Complexity: O(n)
    Auxiliary Space: O(1)

    Last Updated :
    09 Mar, 2023

    Like Article

    Save Article

    Оглавление:

    • 1 Задача — Найти два наименьших (минимальных) элемента массива
      — программирование на Pascal, Си, Кумир, Basic-256, Python

      • 1.1 Pascal
      • 1.2 Язык Си
      • 1.3 Python
      • 1.4 КуМир
      • 1.5 Basic-256

    Задача — Найти два наименьших (минимальных) элемента массива
    — программирование на Pascal, Си, Кумир, Basic-256, Python

    В одномерном массиве целых чисел определить два наименьших элемента. Они могут быть как равны между собой (оба являться минимальными), так и различаться.

    Сначала можно найти минимальный элемент массива. После этого искать второй минимум, исключив их поиска первый с помощью if. Данный способ рассматривается здесь по отношению к двум наибольшим элементам.

    Сложнее задачу решить, используя один цикл перебора.

    Предположим, что двумя наименьшими элементами массива являются первый и второй элемент. Присвоим их индексы переменным m1 и m2. При этом, если первый элемент меньше второго, то его индекс присвоим m1, иначе m1 получит значение второго элемента, а m2 первого.

    Начнем перебирать массив в цикле, начиная с третьего элемента. Если он меньше элемента, чей индекс хранится в m1, то присвоим индекс текущего элемента m1. Иначе (если значение по индексу m1 меньше, чем по индексу i) будем проверять, не меньше ли значение по индексу i, того что по индексу m2.

    Есть один не очевидный нюанс. Допустим, в m1 указывало на значение 5, а m2 — на 10. Очередной элемент равен 3. Мы меняем m1, и забываем о числе 5. Однако оно может оказаться как раз вторым минимумом массива.

    Поэтому в программе при изменении значения m1 надо предусмотреть проверку, не меньше ли теряемое значение, чем то, что хранится по индексу m2.

    Pascal

    const
    N = 10;
    var
    a: array[1..N] of integer;
    i, min1, min2, buff: byte;
    begin
    randomize;
    for i:=1 to N do begin
    a[i] := random(100);
    write(a[i]:4);
    end;
    writeln;

    if a[1] < a[2] then begin
    min1 := 1;
    min2 := 2;
    end
    else begin
    min1 := 2;
    min2 := 1;
    end;

    for i:=3 to N do
    if a[i] < a[min1] then begin
    buff := min1;
    min1 := i;
    if a[buff] < a[min2] then
    min2 := buff;
    end
    else
    if a[i] < a[min2] then
    min2 := i;

    writeln(‘№’, min1:2,’: ‘, a[min1]:2);
    writeln(‘№’, min2:2,’: ‘, a[min2]:2);
    end.    8  66  40  40   0  14  50  74  93  71
    № 5:  0
    № 1:  8

    Язык Си

    #include <stdio.h>
    #define N 10
    main() {
    int a[N];
    int i, min1, min2, buff;
    srand(time(NULL));
    for (i=0; i<N; i++) {
    a[i] = rand() % 100;
    printf(«%3d», a[i]);
    }
    printf(«n»);

    if (a[0] < a[1]) {
    min1 = 0;
    min2 = 1;
    } else {
    min1 = 1;
    min2 = 0;
    }

    for (i=2; i<N; i++) {
    if (a[i] < a[min1]) {
    buff = min1;
    min1 = i;
    if (a[buff] < a[min2]) min2 = buff;
    } else {
    if (a[i] < a[min2]) min2 = i;
    }
    }

    printf(«№%2d:%3dn»,min1+1,a[min1]);
    printf(«№%2d:%3dn»,min2+1,a[min2]);
    }  97 20 88 29 20 43 87 19 33 26
    № 8: 19
    № 5: 20

    Python

    from random import random
    N = 10
    a = []
    for i in range(N):
    a.append(int(random()*100))
    print(«%3d» % a[i], end=»)
    print()

    if a[0] > a[1]:
    min1 = 0
    min2 = 1
    else:
    min1 = 1
    min2 = 0

    for i in range(2,N):
    if a[i] < a[min1]:
    b = min1
    min1 = i
    if a[b] < a[min2]:
    min2 = b
    elif a[i] < a[min2]:
    min2 = i

    print(«№%3d:%3d» % (min1+1, a[min1]))
    print(«№%3d:%3d» % (min2+1, a[min2]))  14  3 40 56 42 43 89 69 64 72
    №  1: 14
    №  2:  3

    КуМир

    алг два минимальных
    нач
    цел N = 10
    цел таб arr[1:N]
    цел i,m1,m2,b
    нц для i от 1 до N
    arr[i] := irand(10,100)
    вывод arr[i]:3
    кц
    вывод нс

    если arr[1] < arr[2] то
    m1 := 1
    m2 := 2
    иначе
    m1 := 2
    m2 := 1
    все

    нц для i от 3 до N
    если arr[i] < arr[m1] то
    b := m1
    m1 := i
    если arr[b] < arr[m2] то
    m2 := b
    все
    иначе
    если arr[i] < arr[m2] то
    m2 := i
    все
    все
    кц
    вывод «№»,m1:2,»:»,arr[m1]:3,нс
    вывод «№»,m2:2,»:»,arr[m2]:3,нс
    кон  65 32 24 86 65 58 67 55 33 96
    № 3: 24
    № 2: 32

    Basic-256

    N = 10
    dim arr(N)
    for i=0 to N-1
    arr[i] = int(rand*100)
    print arr[i] + » «;
    next i
    print

    if arr[0] < arr[1] then
    m1 = 0
    m2 = 1
    else
    m1 = 1
    m2 = 0
    endif

    for i=2 to N-1
    if arr[i] < arr[m1] then
    b = m1
    m1 = i
    if arr[b] < arr[m2] then
    m2 = b
    endif
    else
    if arr[i] < arr[m2] then
    m2 = i
    endif
    endif
    next i

    print (m1+1) + «: » + arr[m1]
    print (m2+1) + «: » + arr[m2] 81 7 25 71 23 9 56 91 73 64
    2: 7
    6: 9

    Did you find apk for android? You can find new Free Android Games and apps.

    Как вычислить 2 наименьших нечетных элемента массива в языке С?


    • Вопрос задан

      более двух лет назад

    • 193 просмотра

    Решайте задачу по частям. Сначала выведите все нечетные элементы в массиве.

    Потом (отдельно) найдите в массиве 2 наименьших элемента.

    Потом совместите 2 алгоритма.

    Пригласить эксперта

    Так?

    int Arr[] = {.......};
    int min1 = (2<<31) -1, min2 = (2<<31) -1;
    for(int i = 0; i < size; ++i)
    {
         if(min1 % 2 == 1 && Arr[i] < min1)
              min1 = Arr[i];
         else if(min2 % 2 == 1 && Arr[i] < min2)
              min2 = Arr[i];
    }


    • Показать ещё
      Загружается…

    26 мая 2023, в 02:01

    10000 руб./за проект

    26 мая 2023, в 01:06

    500 руб./за проект

    26 мая 2023, в 00:08

    2500 руб./за проект

    Минуточку внимания

    Понравилась статья? Поделить с друзьями:
  • Failed attempt to launch program or document как исправить
  • Как найти значение в таблице истинности
  • Как найти хорошего трихолога в москве
  • Как найти свою регистрацию в ютубе
  • Флэшмоб как составить