Как найти меньший элемент массива

Write an efficient C++/C program to find the smallest and second smallest element in an array.

Example:

Input:  arr[] = {12, 13, 1, 10, 34, 1}
Output: The smallest element is 1 and 
        second Smallest element is 10

Approach 1:

A Simple Solution is to sort the array in increasing order. The first two elements in the sorted array would be the two smallest elements. In this approach, if the smallest element is present more than one time then we will have to use a loop for printing the unique smallest and second smallest elements. 

Below is the implementation of the above approach:

C#

using System;

public class GFG {

    static public void Main()

    {

        int[] arr = { 111, 13, 25, 9, 34, 1 };

        int n = arr.Length;

        Array.Sort(arr);

        Console.WriteLine("smallest element is " + arr[0]);

        Console.WriteLine("second smallest element is "

                          + arr[1]);

    }

}

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int arr[] = { 111, 13, 25, 9, 34, 1 };

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

    sort(arr, arr + n);

    cout << "smallest element is " << arr[0] << endl;

    cout << "second smallest element is " << arr[1];

    return 0;

}

Java

import java.io.*;

import java.util.*;

class GFG {

    public static void main(String args[])

    {

        int arr[] = { 111, 13, 25, 9, 34, 1 };

        int n = arr.length;

        Arrays.sort(arr);

        System.out.println("smallest element is " + arr[0]);

        System.out.println("second smallest element is "

                           + arr[1]);

    }

}

Python3

arr = [111, 13, 25, 9, 34, 1]

n = len(arr)

arr.sort()

print("smallest element is "+str(arr[0]))

print("second smallest element is "+str(arr[1]))

Javascript

<script>

let arr = [111, 13, 25, 9, 34, 1];

let n = arr.length;

arr.sort();

document.write("smallest element is "+arr[0],"</br>");

document.write("second smallest element is "+arr[1],"</br>");

</script>

Output

smallest element is 1
second smallest element is 9

Time complexity: O(N*logN)
Auxiliary space: O(1)

Approach 2A: 

A Better Solution is to scan the array twice. In the first traversal find the minimum element. Let this element be x. In the second traversal, find the smallest element greater than x.

Using this method, we can overcome the problem of Method 1 which occurs when the smallest element is present in an array more than one time.

The above solution requires two traversals of the input array. 

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int arr[] = {12, 13, 1, 10, 34, 1};

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

    int smallest = INT_MAX;

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

    {

        if (arr[i] < smallest)

        {

            smallest = arr[i];

        }

    }

    cout << "smallest element is: " << smallest << endl;

    int second_smallest = INT_MAX;

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

    {

        if (arr[i] < second_smallest && arr[i] > smallest)

        {

            second_smallest = arr[i];

        }

    }

    cout << "second smallest element is: " << second_smallest << endl;

    return 0;

}

Java

import java.io.*;

class GFG {

    public static void main(String args[])

    {

        int arr[] = { 12, 13, 1, 10, 34, 1 };

        int n = arr.length;

        int smallest = Integer.MAX_VALUE;

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

            if (arr[i] < smallest) {

                smallest = arr[i];

            }

        }

        System.out.println("smallest element is: "

                           + smallest);

        int second_smallest = Integer.MAX_VALUE;

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

            if (arr[i] < second_smallest

                && arr[i] > smallest) {

                second_smallest = arr[i];

            }

        }

        System.out.println("second smallest element is: "

                           + second_smallest);

    }

}

Python

import sys

arr = [12, 13, 1, 10, 34, 1]

n = len(arr)

smallest = sys.maxint

for i in range(n):

    if(arr[i] < smallest):

        smallest = arr[i]

print('smallest element is: ' + str(smallest))

second_smallest = sys.maxint

for i in range(n):

    if(arr[i] < second_smallest and arr[i] > smallest):

        second_smallest = arr[i]

print('second smallest element is: ' + str(second_smallest))

C#

using System;

public class GFG

{

  static public void Main ()

  {

    int[] arr = { 12, 13, 1, 10, 34, 1 };

    int n = arr.Length;

    int smallest = Int32.MaxValue;

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

    {

      if (arr[i] < smallest)

      {

        smallest = arr[i];

      }

    }

    Console.WriteLine("smallest element is: " + smallest);

    int second_smallest = Int32.MaxValue;

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

    {

      if (arr[i] < second_smallest && arr[i] > smallest)

      {

        second_smallest = arr[i];

      }

    }

    Console.WriteLine("second smallest element is: " + second_smallest);

  }

}

Javascript

<script>

function solution( arr, arr_size)

{

  let first = Number.MAX_VALUE,

        second = Number.MAX_VALUE;

  if (arr_size < 2)

  {

    document.write(" Invalid Input ");

    return;

  }

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

  {

    if (arr[i] < first){

      first = arr[i];

    }

  }

   for (let i = 0; i < arr_size ; i ++){

    if (arr[i] < second && arr[i] > first){

      second = arr[i];

    }

  }

  if (second == Number.MAX_VALUE )

    document.write("There is no second smallest elementn");

  else

    document.write("The smallest element is " + first + " and second "+

      "Smallest element is " + second +'n');

}

  let arr = [ 12, 13, 1, 10, 34, 1 ];

  let n = arr.length;

  solution(arr, n);

</script>

Output

smallest element is: 1
second smallest element is: 10

Time complexity: O(N)
Auxiliary space: O(1)

Approach 2B:

Efficient Solution can find the minimum two elements in one traversal. Below is the complete algorithm.

Algorithm: 

1. Initialize both first and second smallest as INT_MAX

first = second = INT_MAX

2. Loop through all the elements.

  • If the current element is smaller than first, then update first and second
  • Else if the current element is smaller than second then update second.

Below is the implementation of the above approach:

C

#include <limits.h> /* For INT_MAX */

#include <stdio.h>

void print2Smallest(int arr[], int arr_size)

{

    int i, first, second;

    if (arr_size < 2) {

        printf(" Invalid Input ");

        return;

    }

    first = second = INT_MAX;

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

        if (arr[i] < first) {

            second = first;

            first = arr[i];

        }

        else if (arr[i] < second && arr[i] != first)

            second = arr[i];

    }

    if (second == INT_MAX)

        printf("There is no second smallest elementn");

    else

        printf("The smallest element is %d and second "

               "Smallest element is %dn",

               first, second);

}

int main()

{

    int arr[] = { 12, 13, 1, 10, 34, 1 };

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

    print2Smallest(arr, n);

    return 0;

}

C#

using System;

class GFG {

    static void print2Smallest(int[] arr)

    {

        int first, second, arr_size = arr.Length;

        if (arr_size < 2) {

            Console.Write(" Invalid Input ");

            return;

        }

        first = second = int.MaxValue;

        for (int i = 0; i < arr_size; i++) {

            if (arr[i] < first) {

                second = first;

                first = arr[i];

            }

            else if (arr[i] < second && arr[i] != first)

                second = arr[i];

        }

        if (second == int.MaxValue)

            Console.Write("There is no second"

                          + "smallest element");

        else

            Console.Write("The smallest element is " + first

                          + " and second Smallest"

                          + " element is " + second);

    }

    public static void Main()

    {

        int[] arr = { 12, 13, 1, 10, 34, 1 };

        print2Smallest(arr);

    }

}

C++

#include <bits/stdc++.h>

using namespace std;

void print2Smallest(int arr[], int arr_size)

{

    int i, first, second;

    if (arr_size < 2) {

        cout << " Invalid Input ";

        return;

    }

    first = second = INT_MAX;

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

        if (arr[i] < first) {

            second = first;

            first = arr[i];

        }

        else if (arr[i] < second && arr[i] != first)

            second = arr[i];

    }

    if (second == INT_MAX)

        cout << "There is no second smallest elementn";

    else

        cout << "The smallest element is " << first

             << " and second "

                "Smallest element is "

             << second << endl;

}

int main()

{

    int arr[] = { 12, 13, 1, 10, 34, 1 };

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

    print2Smallest(arr, n);

    return 0;

}

Java

import java.io.*;

class SecondSmallest {

    static void print2Smallest(int arr[])

    {

        int first, second, arr_size = arr.length;

        if (arr_size < 2) {

            System.out.println(" Invalid Input ");

            return;

        }

        first = second = Integer.MAX_VALUE;

        for (int i = 0; i < arr_size; i++) {

            if (arr[i] < first) {

                second = first;

                first = arr[i];

            }

            else if (arr[i] < second && arr[i] != first)

                second = arr[i];

        }

        if (second == Integer.MAX_VALUE)

            System.out.println("There is no second"

                               + "smallest element");

        else

            System.out.println("The smallest element is "

                               + first

                               + " and second Smallest"

                               + " element is " + second);

    }

    public static void main(String[] args)

    {

        int arr[] = { 12, 13, 1, 10, 34, 1 };

        print2Smallest(arr);

    }

}

Python3

import math

def print2Smallest(arr):

    arr_size = len(arr)

    if arr_size < 2:

        print("Invalid Input")

        return

    first = second = math.inf

    for i in range(0, arr_size):

        if arr[i] < first:

            second = first

            first = arr[i]

        elif (arr[i] < second and arr[i] != first):

            second = arr[i]

    if (second == math.inf):

        print("No second smallest element")

    else:

        print('The smallest element is', first, 'and',

              ' second smallest element is', second)

arr = [12, 13, 1, 10, 34, 1]

print2Smallest(arr)

PHP

<?php

function print2Smallest($arr, $arr_size)

{

    $INT_MAX = 2147483647;

    if ($arr_size < 2)

    {

        echo(" Invalid Input ");

        return;

    }

    $first = $second = $INT_MAX;

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

    {

        if ($arr[$i] < $first)

        {

            $second = $first;

            $first = $arr[$i];

        }

        else if ($arr[$i] < $second &&

                 $arr[$i] != $first)

            $second = $arr[$i];

    }

    if ($second == $INT_MAX)

        echo("There is no second smallest elementn");

    else

        echo "The smallest element is ",$first

             ," and second Smallest element is "

                                     , $second;

}

$arr = array(12, 13, 1, 10, 34, 1);

$n = count($arr);

print2Smallest($arr, $n)

?>

Javascript

<script>

function print2Smallest( arr, arr_size)

{

    let i, first, second;

    if (arr_size < 2)

    {

        document.write(" Invalid Input ");

        return;

    }

    first=Number.MAX_VALUE ;

    second=Number.MAX_VALUE ;

    for (i = 0; i < arr_size ; i ++)

    {

        if (arr[i] < first)

        {

            second = first;

            first = arr[i];

        }

        else if (arr[i] < second && arr[i] != first)

            second = arr[i];

    }

    if (second == Number.MAX_VALUE )

        document.write("There is no second smallest elementn");

    else

        document.write("The smallest element is " + first + " and second "+

            "Smallest element is " + second +'n');

}

    let arr = [ 12, 13, 1, 10, 34, 1 ];

    let n = arr.length;

    print2Smallest(arr, n);

</script>

Output

The smallest element is 1 and second Smallest element is 10

The same approach can be used to find the largest and second-largest elements in an array.

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

Approach 3:

A N*log(N) approach using Priority_queue data structure. You can read about Priority Queue in more detail here.

C#

using System;

using System.Collections.Generic;

class GFG {

    static void Main(string[] args)

    {

        int[] arr = { 2, 5, 7, 3, 9, 10, 11, 1 };

        int n = arr.Length;

        PriorityQueue<int> pq = new PriorityQueue<int>();

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

            pq.Enqueue(arr[i]);

        }

        int t = pq.Peek();

        pq.Dequeue();

        int w = pq.Peek();

        Console.WriteLine("smallest element : " + t);

        Console.WriteLine("second smallest element : " + w);

    }

}

public class PriorityQueue<T> where T : IComparable<T> {

    private List<T> data;

    public PriorityQueue() { this.data = new List<T>(); }

    public void Enqueue(T item)

    {

        data.Add(item);

        int ci = data.Count - 1;

        while (ci > 0) {

            int pi = (ci - 1) / 2;

            if (data[ci].CompareTo(data[pi]) >= 0)

                break;

            T tmp = data[ci];

            data[ci] = data[pi];

            data[pi] = tmp;

            ci = pi;

        }

    }

    public T Dequeue()

    {

        int li = data.Count - 1;

        T frontItem = data[0];

        data[0] = data[li];

        data.RemoveAt(li);

        --li;

        int pi = 0;

        while (true) {

            int ci = pi * 2 + 1;

            if (ci > li)

                break;

            int rc = ci + 1;

            if (rc <= li

                && data[rc].CompareTo(data[ci]) < 0)

                ci = rc;

            if (data[pi].CompareTo(data[ci]) <= 0)

                break;

            T tmp = data[pi];

            data[pi] = data[ci];

            data[ci] = tmp;

            pi = ci;

        }

        return frontItem;

    }

    public T Peek()

    {

        T frontItem = data[0];

        return frontItem;

    }

    public int Count

    {

        get { return data.Count; }

    }

}

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int arr[] = { 2, 5, 7, 3, 9, 10, 11, 1 };

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

    priority_queue<int, vector<int>, greater<int> >

        pq;

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

        pq.push(arr[i]);

    }

    int t = pq.top();

    pq.pop();

    int w = pq.top();

    cout << "smallest element : " << t << endl;

    cout << "second smallest element : " << w << endl;

    return 0;

}

Java

import java.util.*;

class GFG {

    public static void main(String[] args)

    {

        int arr[] = { 2, 5, 7, 3, 9, 10, 11, 1 };

        int n = arr.length;

        PriorityQueue<Integer> pq

            = new PriorityQueue<Integer>();

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

            pq.add(arr[i]);

        }

        int t = pq.peek();

        pq.poll();

        int w = pq.peek();

        System.out.println("smallest element : " + t);

        System.out.println("second smallest element : "

                           + w);

    }

}

Python3

from queue import PriorityQueue

arr = [2, 5, 7, 3, 9, 10, 11, 1]

n = len(arr)

pq = PriorityQueue()

for i in range(0, n):

    pq.put(arr[i])

t = pq.get() 

w = pq.get()

print("smallest element :", t)

print("second smallest element :", w)

Javascript

class PriorityQueue {

  constructor() {

    this.values = [];

  }

  enqueue(val, priority) {

    this.values.push({ val, priority });

    this.sort();

  }

  dequeue() {

    return this.values.shift();

  }

  sort() {

    this.values.sort((a, b) => a.priority - b.priority);

  }

  get top() {

    return this.values[0].val;

  }

  get secondTop() {

    return this.values[1].val;

  }

}

const arr = [2, 5, 7, 3, 9, 10, 11, 1];

const pq = new PriorityQueue();

for (let i = 0; i < arr.length; i++) {

  pq.enqueue(arr[i], arr[i]);

}

const t = pq.top;

pq.dequeue();

const w = pq.top;

console.log("smallest element: ", t);

console.log("second smallest element: ", w);

Output

smallest element : 1
second smallest element : 2

Time Complexity: O(n*log(n))
In a priority queue time for adding each element is O(logn) and we are adding all the elements so the total time taken by the priority queue will be O(n*logn)

Auxiliary Space: O(n)

The extra space is used to store the elements in the priority queue.

Related Article: Minimum and Second minimum elements using minimum comparisons

Approach 4: Using list properties

Algorithm:

  • Step 1: Declare a  new list
  • Step 2: Check length of the original list is more than 2 or not.
  • Step 3: Append the smallest element from the original list into new list.
  • Step 4: Count the number times smallest element appeared in the original list, then run a loop to remove all the smallest elements from the original list.
  • Step 5: After removing all smallest elements, now find for 2nd smallest element using min function.
  • Step 6: return new list which contains the smallest element and 2nd smallest element.

Example:

C++

#include <bits/stdc++.h>

using namespace std;

vector<int> print2Smallest(vector<int> arr)

{

    vector<int> lst;

    if (unordered_set<int>(arr.begin(), arr.end()).size()

        == 1) {

        return { -1, -1 };

    }

    lst.push_back(*min_element(

        arr.begin(), arr.end()));

    int p = *min_element(arr.begin(),

                         arr.end());

    int c = count(arr.begin(), arr.end(),

                  p);

    arr.erase(

        remove(arr.begin(), arr.end(), p),

        arr.end());

    lst.push_back(*min_element(

        arr.begin(),

        arr.end()));

    return lst;

}

int main()

{

    vector<int> arr = { 12, 13, 1, 10, 34, 1 };

    vector<int> res = print2Smallest(arr);

    for (int i = 0; i < res.size(); i++) {

        cout << res[i] << " ";

    }

    return 0;

}

Java

import java.util.*;

public class Main {

    public static List<Integer>

    print2Smallest(List<Integer> arr)

    {

        List<Integer> lst

            = new ArrayList<>();

        if (new HashSet<Integer>(arr).size()

            == 1) {

            return Arrays.asList(-1, -1);

        }

        lst.add(Collections.min(

            arr));

        int p = Collections.min(arr);

        int c = Collections.frequency(

            arr, p);

        arr.removeAll(Collections.singleton(

            p));

        lst.add(Collections.min(

            arr));

        return lst;

    }

    public static void main(String[] args)

    {

        List<Integer> arr = new ArrayList<>(

            Arrays.asList(12, 13, 1, 10, 34, 1));

        List<Integer> res = print2Smallest(arr);

        for (int i = 0; i < res.size(); i++) {

            System.out.print(res.get(i) + " ");

        }

    }

}

Python3

def print2Smallest(arr):

    lst = [] 

    if len(set(arr)) == 1

        return [-1, -1]           

    lst.append(min(arr)) 

    p = min(arr) 

    c = arr.count(p) 

    for i in range(c):

        arr.remove(p)             

    lst.append(min(arr)) 

    return lst

arr = [12, 13, 1, 10, 34, 1]

print(print2Smallest(arr))

Javascript

function print2Smallest(arr) {

  let lst = [];

  if (new Set(arr).size === 1) {

    return [-1, -1];

  }

  lst.push(Math.min(...arr));

  let p = Math.min(...arr);

  let c = arr.filter((el) => el === p).length;

  for (let i = 0; i < c; i++) {

    arr.splice(arr.indexOf(p), 1);

  }

  lst.push(Math.min(...arr));

  return lst;

}

let arr = [12, 13, 1, 10, 34, 1];

console.log(print2Smallest(arr));

C#

using System;

using System.Collections.Generic;

using System.Linq;

public class MainClass {

    public static List<int> Print2Smallest(List<int> arr) {

        List<int> lst = new List<int>();

        if (new HashSet<int>(arr).Count == 1) {

            return new List<int> {-1, -1};

        }

        lst.Add(arr.Min());

        int p = arr.Min();

        int c = arr.Count(x => x == p);

        arr.RemoveAll(x => x == p);

        lst.Add(arr.Min());

        return lst;

    }

    public static void Main() {

        List<int> arr = new List<int>{12, 13, 1, 10, 34, 1};

        List<int> res = Print2Smallest(arr);

        foreach (int i in res) {

            Console.Write(i + " ");

        }

    }

}

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

Please write comments if you find any bug in the above program/algorithm or other ways to solve the same problem.

Last Updated :
13 Apr, 2023

Like Article

Save Article

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

В данной статье вы узнаете, как написать реализацию программы на языке C++, которая находит максимальный и минимальный элемент в массиве и выводит на экран. А узнать множество решений других задач можно в разделе с решениями задач по программированию на языке C++.

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

Для начала поймем, что же такое максимальный или минимальный элемент в массиве? Всё просто, максимальный элемент массива — это элемент, который имеет самое большое числовое значение, а минимальный элемент массива — это элемент, имеющий самое маленькое значение.

Пример: в массиве, состоящем из таких элементов: 3, 1, 0, -4, 16, 2 — максимальный элемент равен 16, т.к. это число больше других, а минимальный элемент равен -4, т.к. оно меньше остальных.

Поняв это, можно приступить к решению задачи.

Алгоритм решения задачи

— Инициализация массива, переменных, хранящих минимальное и максимальное значение.

— Заполнение массива случайными числами при помощи цикла и функции, возвращающей случайные числа.

— Вывод массива.

— Сравнение каждого элемента массива: Если элемент больше переменной с максимальным значением, то значение записывается в переменную; Если элемент меньше переменной с минимальным значением, то значение записывается в переменную.

— Вывод переменных с максимальным и минимальным элементом.

Алгоритм решения на языке C++

Для начала нужно подключить заголовок ввода/вывода <iostream>, заголовок стандартных функций <cstdlib> в ней имеется функция rand(), которая позволит заполнить массив случайными числами. Заполнение каждого элемента массива вручную требует времени, его можно сэкономить автоматизировав процесс. Подключаем пространство имён std. Создаём константу N, она будет определять количество элементов в массиве.

#include <iostream> 
#include <cstdlib> 

using namespace std; //Пространство имён std

const int N = 10;//Количество элементов в массиве

int main() 
{

	return 0;
}

В теле функции main() инициализируем массив целых чисел из N лементов, целочисленные переменные max и min, они будут хранить значение максимального и минимального элементов массива соответственно.

	int mass[N], max, min;

Теперь заполним массив случайными числами. Для этого используем цикл от 0 до N (не включительно), который пройдется по каждому элементу массива и поместит случайное значение от 0 до 98. Это можно сделать, использовав функцию rand(), которая возвращает случайное число. Поделить возвращаемое значение на 99 и внести в ячейку остаток от деления, таким образом значение ячейки будет иметь значение в диапазоне от 0 до 99(не включая 99, т.к. остаток от деления не может быть кратным делителю).  При этом выведем значения элементов массива на экран.

	cout << "Элементы: |";
	for(int r = 0; r<N; r++) // Цикл от 0 до N
	{
		mass[r] = rand()%99; // Заполнение случайным числом
		cout << mass[r] << "|"; // Вывод значения
	}
	cout << endl;

В результате программа выведет на экран значения элементов массива, разделенное вертикальными чертами:

Элементы: |28|43|72|79|23|70|55|39|69|1|

Обратите внимание! Если вы программируете под Windows и у Вас не отображаются русские символы в консоли, то советую Вам почитать о решении этой проблемы в статье Русские символы(буквы) при вводе/выводе в консоль на C++.

Далее определим максимальный и минимальный элемент в массиве, для этого вновь пройдемся по массиву циклом. При помощи условия определим максимальный и минимальный элемент массива.

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

	max = mass[0];//Помещаем значения 1-го элемента
	min = mass[0];//массива в переменные
	for(int r = 1; r<N; r++)
	{
		if(max < mass[r]) max = mass[r]; //если значение элемента больше значения переменной max, то записываем это значение в переменную
		if(min > mass[r]) min = mass[r]; //аналогично и для min
	}

После цикла выведем значения min и max.

	cout << "Min: " << min << endl;
	cout << "Max: " << max << endl;

После компиляции и запуска прогамма выводит следующее

Элементы: |28|43|72|79|23|70|55|39|69|1|
Min: 1
Max: 79

Пробегаемся по элементам массива глазами и видим, что минимальное значение — 1, а максимальное — 79. Переменные min и max имеют эти же значения соответственно, следовательно алгоритм работает.

Весь листинг программы на C++

#include <iostream>
#include <cstdlib>

using namespace std;

const int N = 10;

int main() 
{
	int mass[N], max, min;

	cout << "Элементы: |";
	for(int r = 0; r<N; r++)
	{
		mass[r] = rand()%99;
		cout << mass[r] << "|";
	}
	cout << endl;
	
	max = mass[0];
	min = mass[0];
	for(int r = 1; r<N; r++)
	{
		if(max < mass[r]) max = mass[r];
		if(min > mass[r]) min = mass[r];
	}
	cout << "Min: " << min << endl;
	cout << "Max: " << max << endl;
	
	return 0;
}

Раздел:
Задачи /
Простейшие /

Найти наименьший элемент массива

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

Условие задачи 2.49

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

Первым делом обращаем внимание на то, что массив не упорядочен (не отсортирован). То есть значения элементов в массиве хранятся “как попало”.

Соответственно, такой массив надо создать. Способа два: вводить значения элементов вручную, либо создать массив программно. Разумеется, сделаем это программно – заполним массив случайными значениями.

Второе – в массиве целые числа. Но целые числа могут быть также и отрицательными. Поэтому при заполнении массива случайными числами это желательно предусмотреть.

Поиск наименьшего значения в массиве

Теперь о том, как будем искать. Есть два относительно простых способа:

  1. Отсортировать массив по возрастанию значений. Тогда первый элемент массива будет наименьшим. Однако этот способ сам по себе не слишком простой, к тому же в задаче сказано, что надо получить кроме значения ещё и номер элемента. А при сортировке номера изменятся, и это потеряет смысл (либо придётся запоминать старые номера).
  2. Перебирать все элементы массива и искать самый меньший.

Мы воспользуемся вторым способом.

Сначала во временной переменной MinA сохраним наибольшее возможное значение типа данных, которому принадлежат элементы массива. Затем будем перебирать все элементы массива и сравнивать его с этим значением. Если значение текущего элемента меньше или равно значению MinA, то в переменную MinA запишем значение текущего элемента. И так далее, пока не переберём все элементы массива.

Почему меньше или равно, а не меньше? Дело в том, что теоретически (хотя и почти невозможно в нашем случае), все элементы массива могут содержать наибольшее значение для выбранного типа данных. И тогда, если проверять на “меньше”, программа не выведет никакой итог (либо придётся усложнять программу).

Решение задачи 2.49 на Паскале

 
program mytask;

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const
  MAX_A = 16;

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
var
  i       : byte;                 //Индекс
  MinA    : byte;                 //Наименьшее значение в массиве
  MaxInt  : ShortInt;             //Наибольшее значение типа
  MinInt  : ShortInt;             //Переменная для поиска
  A       : array[1..MAX_A] of ShortInt;  //Массив

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
begin
  MaxInt := High(MaxInt);   //Получить наибольшее значение типа
  randomize;                //Запустить генератор случайных чисел

  //Создать массив и вывести на экран
  for i := 1 to MAX_A do
    begin
      A[i] := random(MaxInt) - (MaxInt div 3);
      WriteLn(A[i]);
    end;

  //Найти наименьший элемент в массиве
  MinInt := MaxInt;
  for i := 1 to MAX_A do
    if A[i] <= MinInt then
      begin
        MinInt := A[i];
        MinA := i;
      end;

  //Вывести решение на экран
  WriteLn('Problem solution:');
  WriteLn('  The smallest value in the array: ', MinInt);
  WriteLn('  Index of the element with the lowest value: ', MinA);

  WriteLn('The end. Press ENTER...');
  ReadLn;
end.

Решение задачи 2.49 на С++

#include <cstdlib>
#include <iostream>

const int MAX_A = 16;

using namespace std;

char i;           //Индекс
char MinA;        //Наименьшее значение в массиве
char MaxInt;      //Наибольшее значение типа
char MinInt;      //Переменная для поиска
char A[MAX_A-1];  //Массив        

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  MaxInt = CHAR_MAX;   //Получить наибольшее значение типа
  srand(time(0));      //Запустить генератор случайных чисел              

  //Создать массив и вывести на экран
  for(i = 0; i < MAX_A; i++)
  {
    A[i] = (rand() % MaxInt) - (MaxInt / 3);
    cout << int(A[i]) << endl;
  }

  //Найти наименьший элемент в массиве
  MinInt = MaxInt;
  for(i = 0; i < MAX_A; i++)
    if(A[i] <= MinInt)
    {
      MinInt = A[i];
      MinA = i;
    }

  //Вывести решение на экран
  cout << "Problem solution:" << endl;
  cout << "  The smallest value in the array: " << int(MinInt) << endl;
  cout << "  Index of the element with the lowest value: " 
       << int(MinA) << endl;  
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

ПРИМЕЧАНИЕ
Не забывайте, что в С++ индексация массива начинается с нуля.

Найти номер наименьшего элемента в массиве

Как стать программистом 2.0

Как стать программистом 2.0

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

Помощь в технических вопросах

Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение – ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
Подробнее…

Цыпленок Цыпа

6 / 6 / 0

Регистрация: 27.10.2014

Сообщений: 120

1

Найти и вывести наименьший элемент массива

22.09.2015, 16:36. Показов 9317. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Дан объем продукции, выпущенной заводом за год (помесячно). Найти наименьший объем. В качестве результата вывести номер месяца и объем выпущенной продукции.

Помогите правильно вывести что бы был номер месяца

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
#include <conio.h>
void main()
{
const int size=12;
int mas[size]={12,3,45,14,15,7,22,34,8,40,10,17};
int min=mas[0];
int index=0;
for(int i=0;i<size;i++)
{
if(mas[i]<min)
{
min=mas[i];
index=i;
}
}
 
 
cout<<min<<endl;
getch();
}

Спасибо за помощь.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

22.09.2015, 16:36

Ответы с готовыми решениями:

Дан массив размерности N, найти наименьший элемент массива и вывести на консоль
Дан массив размерности N, найти наименьший элемент массива и вывести на консоль (если наименьших…

Найти самый наименьший элемент в матрице, и найти сумму столбца который стоит этот наименьший найденный элемент
Найти самый наименьший элемент в матрице, и найти сумму столбца который стоит этот наименьший…

Создать одномерный массив, найти наименьший элемент 3-го столбца, поменять местами наименьший элемент элементы
Дана матрица А(5,3)
1 Создать новый одномерный массив,каждый элемент которого равен среднему…

Создать новый массив, найти наименьший элемент 3-го столбца, поменять местами наименьший элемент 3-го столбца и элемент a23
1 Создать новый одномерный массив , каждый элемент которого равен среднему арифметическому…

6

gledor

130 / 25 / 12

Регистрация: 12.08.2015

Сообщений: 221

22.09.2015, 16:50

2

После строчки…

C++
1
cout << min << endl;

надо написать

C++
1
cout << ++index << endl;

Вот тебе и номер месяца. Невероятно сложная задача, не так ли?



0



isobo531

50 / 49 / 29

Регистрация: 11.11.2014

Сообщений: 332

22.09.2015, 16:50

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <conio.h>
void main()
{
    const int size=12;
    int mas[size]={12,3,45,14,15,7,22,34,8,40,10,17};
    int min=mas[0];
    int index=0;
    for(int i=0;i<size;i++)
    {
        if(mas[i]<min)
        {
           min=mas[i];
           index=i;
        }
    }
    std::cout << min << std::endl;
    std::cout << index + 1 << std::endl;
 
    _getch();
}



0



6 / 6 / 0

Регистрация: 27.10.2014

Сообщений: 120

22.09.2015, 16:59

 [ТС]

4

gledor, спасибо за помощь. Думаешь если бы я разбирался, стал бы я спрашивать?



0



130 / 25 / 12

Регистрация: 12.08.2015

Сообщений: 221

22.09.2015, 17:02

5

Цитата
Сообщение от Цыпленок Цыпа
Посмотреть сообщение

gledor, спасибо за помощь. Думаешь если бы я разбирался, стал бы я спрашивать?

Да это ясно, что не стал бы, но может всё-таки стоит подтянуть знания? Надо Федя. Надо!.



0



6 / 6 / 0

Регистрация: 27.10.2014

Сообщений: 120

22.09.2015, 17:10

 [ТС]

6

gledor, эта лаба еще с первого курса. Нет времени изучать методички по новой. Какой Федя?



0



130 / 25 / 12

Регистрация: 12.08.2015

Сообщений: 221

22.09.2015, 17:33

7

Цитата
Сообщение от Цыпленок Цыпа
Посмотреть сообщение

Какой Федя?

Это уже устойчивый оборот речи, являющийся цитатой из фильма “Операция Ы и другие приключения Шурика”.
Если по теме, тебе необходимо подтянуть C++ с нуля. А то так можешь и не доучиться. Есть хорошая книга Visual C++ Полный курс, Айвор Хортон.

Книга поможет. Что касаемо кода, надо было в нем все-таки разобраться, потому что видно, что писал другой человек)



0



Самый простой способ

Разумеется, проще всего получить минимальный и максимальный элементы массива с помощью функций min() и max():

$arr = [8, 4, 12, 9];
$max = max($arr); // 12
$min = min($arr); // 4

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

Условия задачи

1. Найти наибольший наименьший элементы в одномерном числовом массиве.
2. Определить номер минимального и максимального элементов заданного одномерного массива.
3. Найти минимальное и максимальное значение в ассоциативном массиве.

Общий принцип поиска элементов

Во всех решениях мы будем использовать одну и ту же логику.

Согласно условию, нам необходимо объявить числовой массив произвольной длины. Также объявим 4 переменные, в которые будем помещать найденные значения и их ключи:

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;

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

И если больше – будем записывать в $max новое максимальное значение, а в $max_key его ключ. Абсолютно также поступим и с минимальными ключом и значением.

Пример с циклом foreach:

foreach($arr as $k => $v)
{
	if($v > $max)
	{
		$max = $v;
		$max_key = $k;
	}

	if($v < $min)
	{
		$min = $v;
		$min_key = $k;
	}
}

На данном этапе наш код уже будет работать, но это ещё не всё. Попробуем изменить исходный массив и посмотрим на результат:

<?php
$arr = [0, -12];
$max = null;

foreach($arr as $v)
{
	if($v > $max)
		$max = $v;
}

var_dump($max); // -12

Максимальным должно быть число 0, но скрипт вывел -12. Дело в том, что PHP не считает истинным выражение 0 > null, поэтому ноль на первой итерации цикла не записался в переменную $max.

Для решения этой проблемы просто добавим условие, что если $max === null, т.е. если это первая итерация, то в любом случае записываем текущее значение в $min и $max:

<?php
$arr = [0, -12];
$max = null;

foreach($arr as $v)
{
    if($v > $max or $max === null)
        $max = $v;
}

var_dump($max); // -12

Минимальный и максимальный элементы с циклом FOREACH

Решение:

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;

foreach($arr as $k => $v)
{
	if($v > $max or $max === null)
	{
		$max = $v;
		$max_key = $k;
	}

	if($v < $min or $min === null)
	{
		$min = $v;
		$min_key = $k;
	}
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Минимальный и максимальный элементы с циклом WHILE

Решение 1: счётчик + count()

Цикл будет выполняться до тех пор, пока значение счётчика $i не превысит количество элементов массива.

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;

while($i < count($arr))
{
    if($arr[$i] > $max or $max === null)
    {
        $max = $arr[$i];
        $max_key = $i;
    }

    if($arr[$i] < $min or $min === null)
    {
        $min = $arr[$i];
        $min_key = $i;
    }

	$i++;
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Решение 2: счётчик + isset()

Запускаем вечный цикл while и в каждой итерации цикла проверяем существование следующего элемента с помощью isset(). Если его нет – выходим из цикла оператором break:

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;

while(true)
{
	if(isset($arr[$i]))
	{
		if($arr[$i] > $max or $max === null)
		{
			$max = $arr[$i];
			$max_key = $i;
		}

		if($arr[$i] < $min or $min === null)
		{
			$min = $arr[$i];
			$min_key = $i;
		}
	}
	else
		break;

	$i++;
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Решение 3: list() + each()

Функция each() возвращает ключ и значение текущего элемента массива и смещает его внутренний указатель на единицу. Функция list() используется просто для удобства – с её помощью мы превращаем массив, который возвращает функция each, в две разные переменные:

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;

while(list($k, $v) = each($arr))
{
	if($v > $max or $max === null)
	{
		$max = $v;
		$max_key = $k;
	}

	if($v < $min or $min === null)
	{
		$min = $v;
		$min_key = $k;
	}
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Получился практически аналог foreach. Единственный минус в том, что начиная с PHP 7.2 функция each() объявлена устаревшей.

Решение 4: current() + next()

Это решение похоже на предыдущее с each(). Получаем текущий элемента массива функцией current() и смещаем внутренний указатель массива функцией next(). Получить текущий ключ массива можно с помощью функции key().

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;

while($v = current($arr))
{
	if($v > $max or $max === null)
	{
		$max = $v;
		$max_key = key($arr);
	}

	if($v < $min or $min === null)
	{
		$min = $v;
		$min_key = key($arr);
	}

	next($arr);
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Наибольший и наименьший элементы с циклом FOR

Решение 1: счётчик + count()

Вводим счётчик $i и увеличиваем его после каждой итерации. Цикл прекратится как только значение счётчика превысит количество элементов массива.

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;

for($i = 0; $i < count($arr); $i++)
{
    if($arr[$i] > $max or $max === null)
    {
        $max = $arr[$i];
        $max_key = $i;
    }

    if($arr[$i] < $min or $min === null)
    {
        $min = $arr[$i];
        $min_key = $i;
    }
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Решение 2: счётчик + isset()

В отличие от предыдущего варианта, мы не смотрим на количество элементов массива, а запускаем вечный цикл и в каждой итерации проверяем существование следующего элемента, и если его нет – прерываем цикл командой break:

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;

for($i = 0; true; $i++)
{
	if(!isset($arr[$i]))
		break;

    if($arr[$i] > $max or $max === null)
    {
        $max = $arr[$i];
        $max_key = $i;
    }

    if($arr[$i] < $min or $min === null)
    {
        $min = $arr[$i];
        $min_key = $i;
    }
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Решение 3: each() + list()

Функция each() возвращает массив с ключом и значением текущего элемента массива, а list() превращает этот массив в 2 разные переменные. После последнего элемента функция each() вернёт false и цикл прекратит работу.

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;

for(; list($k, $v) = each($arr);)
{
    if($v > $max or $max === null)
    {
        $max = $v;
        $max_key = $k;
    }

    if($v < $min or $min === null)
    {
        $min = $v;
        $min_key = $k;
    }
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Решение 4: current() + next()

С помощью функции next() смещаем внутренний указатель массива, а функции current() и key() возвращают текущие ключ и значение. Первое и последнее выражение цикла оставляем пустыми.

<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;

for(; $v = current($arr);)
{
	if($v > $max or $max === null)
	{
		$max = $v;
		$max_key = key($arr);
	}

	if($v < $min or $min === null)
	{
		$min = $v;
		$min_key = key($arr);
	}

	next($arr);
}

echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";

Максимальное значение в ассоциативном массиве

В ассоциативных массивах отсутствует порядок или системность в названиях ключей, поэтому циклы со счётчиками здесь недоступны.

Но мы всё ещё можем использовать цикл foreach и те решения для while и for, где используются функции each() и next(), поскольку они используют не ключи, а внутренний указатель массива.

Добавить комментарий