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

ios21

0 / 0 / 0

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

Сообщений: 76

1

11.12.2017, 21:30. Показов 10136. Ответов 5

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


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

Код есть, но не знаю как подправить, выводит массив целиком

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main()
{
    int const N = 20;
    int N, i, j, Max;
    cout << "Vvedi kol-vo elementov: ";
    cin >> N;
    int a[N];
    int max[3];
    max[0] = a[0];
    max[1] = a[1];
    max[2] = a[2];
    for (i = 3; i<N; i++)
    {
        if (max[0] < a[i])
            max[0] = a[i];
        else if (max[1] < a[i])
            max[1] = a[i];
        else if (max[2] < a[i])
            max[2] = a[i];
    }
    system("pause");
    return 0;
}



0



1718 / 567 / 187

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

Сообщений: 2,169

11.12.2017, 22:02

2

Лучший ответ Сообщение было отмечено Kuzia domovenok как решение

Решение

Этот код по идее и компилиться не должен, не то что еще 3 наибольших находить.



1



Gaveyn

99 / 98 / 11

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

Сообщений: 195

12.12.2017, 00:08

3

Ты сначала говоришь что у тебя есть целая константа N=20,в следующей строке ты уже говоришь что это у тебя просто целое число,а потом предлагаешь пользователю его ввести!

C++
1
int a [N] // это вообще работать не будет



2



Lyumary

3 / 3 / 3

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

Сообщений: 3

12.12.2017, 02:41

4

Лучший ответ Сообщение было отмечено ios21 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
 
 
int main()
{
    int N;
    std::cout << "Vvedi kol-vo elementov: ";
    std::cin >> N;
    int mas[N];
    for (int i = 0; i < N; i++) {
        std::cin >> mas[i];
    }
    int max, nmax;
   for (int x = N-1; x != N-4; x--)
   {
       max = mas[0];
       nmax = 0;
       for (int k = 1; k < x+1; k++) {
          if (max < mas[k]) { 
              max = mas[k];
              nmax = k;
          }
       }
       mas[nmax] = mas[x];
       mas[x] = max;
    
    
   }
    std::cout << "три наибольших числа: " << mas[N-1] << ", " << mas[N-2] << ", " << mas[N-3];
}

+STL

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
#include <algorithm> 
 
int main()
{
    int N;
    std::cout << "Vvedi kol-vo elementov: ";
    std::cin >> N;
    
   std::vector<int> mas;
   
   for (int i = 0; i < N; i++) {
        int x;
        std:: cin >> x;
        mas.push_back(x);
    }
   
   std::sort (mas.begin(), mas.end());
   
   
   for (size_t i = mas.size() ; i > mas.size() - 3;) {
       std:: cout << mas[--i] << " ";
   }       
 }



2



kolit

12 / 9 / 5

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

Сообщений: 25

12.12.2017, 03:56

5

вот как пример работы со статическим и динамическим массивом

программа создает динамический массив случайных чисел и находит sizeLargestArr=3 наибольших числа.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>
using namespace std;
 
int main(){
 
    /* это динамический массив (для него необходимо выделить память)*/
    int *arr;                                   //наш массив
    int sizeArr=0;                             //размер массива
 
    /*а тут массив с фиксировным размером (размер массива константа)*/
    const int sizeLargestArr=3;
    int largestArr[sizeLargestArr];
 
    cout<<"wriste the size of the array ";
    cin>>sizeArr;
 
    if(sizeArr<=0){                             //если массив пустой или отр. значение
        cout<<"size in write incorrectly";
        return -1;
    }
 
    arr=new int[sizeArr];                       //создадим массив
    for(int i=0;i<sizeArr;i++)                  //заполним массив случайными числами
        arr[i]=rand()%100;
 
    int largesI=0;                              //индекс максимального числа по умолчанию первый елемент массива максимальный
 
    for(int i=0;i<sizeLargestArr; i++){          //условия выполнены если найдены sizeLargestArr наибольших чисел
        for(int j=0;j<sizeArr;j++){              //от первого до последнего елемента массива
            if(arr[j]>arr[largesI]){                    //число макс
                if(i==0)                                // первое макс число
                    largesI=j;
                else if(arr[j] < arr[largestArr[i-1]])  //число меньше предыдущего максимального
                    largesI=j;
            }
        largestArr[i]=largesI;                  //запишем индекс макс елемента в массив
        }
 
        largesI=0;
        while (arr[largesI]>=arr[largestArr[i]]){//найдем первое не максимальное число
            if(largesI > sizeArr-1){            //чисел наибольших меньше чем размер массива
                cout<<"the maximum number is less than the size of the array"<<endl;
                largesI=largestArr[i];
                break;
            }
            largesI++;
        }
    }
 
 
 
    cout<<"output array: "<<endl;                //віведм наш массив
    for(int i=0;i<sizeArr;i++)
        cout<<arr[i]<<" ";
 
    cout<<endl<<endl<<"display the index and the value "<< sizeArr<<" largest elements of the array"<<endl;
 
    for(int i=0;i<sizeLargestArr;i++)           //наиболшие значения
        cout<<"arr["<<largestArr[i]<<"]= "<<arr[largestArr[i]]<<endl;
 
    delete []arr;//очищаем память 
    return 0;
}



1



12 / 9 / 5

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

Сообщений: 25

12.12.2017, 04:02

6

результат работы программы:

3 наибольших элемента в массиве



1



Given an array with all distinct elements, find the largest three elements. Expected time complexity is O(n) and extra space is O(1). 

Examples :

Input: arr[] = {10, 4, 3, 50, 23, 90}
Output: 90, 50, 23

Method 1:

Algorithm:

1) Initialize the largest three elements as minus infinite.
    first = second = third = -∞

2) Iterate through all elements of array.
   a) Let current array element be x.
   b) If (x > first)
      {
          // This order of assignment is important
          third = second
          second = first
          first = x   
       }
   c)  Else if (x > second and x != first)
      {
          third = second
          second = x 
      }
   d)  Else if (x > third and x != second)
      {
          third = x  
      }

3) Print first, second and third.

Below is the implementation of the above algorithm.

C++

#include <bits/stdc++.h>

using namespace std;

void print3largest(int arr[], int arr_size)

{

    int first, second, third;

    if (arr_size < 3)

    {

        cout << " Invalid Input ";

        return;

    }

    third = first = second = INT_MIN;

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

    {

        if (arr[i] > first)

        {

            third = second;

            second = first;

            first = arr[i];

        }

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

        {

            third = second;

            second = arr[i];

        }

        else if (arr[i] > third && arr[i] != second)

            third = arr[i];

    }

    cout << "Three largest elements are "

        << first << " " << second << " "

        << third << endl;

}

int main()

{

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

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

    print3largest(arr, n);

    return 0;

}

C

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

#include <stdio.h>

void print3largest(int arr[], int arr_size)

{

    int i, first, second, third;

    if (arr_size < 3) {

        printf(" Invalid Input ");

        return;

    }

    third = first = second = INT_MIN;

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

        if (arr[i] > first) {

            third = second;

            second = first;

            first = arr[i];

        }

        else if (arr[i] > second) {

            third = second;

            second = arr[i];

        }

        else if (arr[i] > third)

            third = arr[i];

    }

    printf("Three largest elements are %d %d %dn", first, second, third);

}

int main()

{

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

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

    print3largest(arr, n);

    return 0;

}

Java

class PrintLargest {

    static void print3largest(int arr[], int arr_size)

    {

        int i, first, second, third;

        if (arr_size < 3) {

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

            return;

        }

        third = first = second = Integer.MIN_VALUE;

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

            if (arr[i] > first) {

                third = second;

                second = first;

                first = arr[i];

            }

            else if (arr[i] > second) {

                third = second;

                second = arr[i];

            }

            else if (arr[i] > third)

                third = arr[i];

        }

        System.out.println("Three largest elements are " + first + " " + second + " " + third);

    }

    public static void main(String[] args)

    {

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

        int n = arr.length;

        print3largest(arr, n);

    }

}

Python3

import sys

def print3largest(arr, arr_size):

    if (arr_size < 3):

        print(" Invalid Input ")

        return

    third = first = second = -sys.maxsize

    for i in range(0, arr_size):

        if (arr[i] > first):

            third = second

            second = first

            first = arr[i]

        elif (arr[i] > second):

            third = second

            second = arr[i]

        elif (arr[i] > third):

            third = arr[i]

    print("Three largest elements are",

                  first, second, third)

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

n = len(arr)

print3largest(arr, n)

C#

using System;

class PrintLargest {

    static void print3largest(int[] arr,

                              int arr_size)

    {

        int i, first, second, third;

        if (arr_size < 3) {

            Console.WriteLine("Invalid Input");

            return;

        }

        third = first = second = 000;

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

            if (arr[i] > first) {

                third = second;

                second = first;

                first = arr[i];

            }

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

                third = second;

                second = arr[i];

            }

            else if (arr[i] > third && arr[i]!=second)

                third = arr[i];

        }

        Console.WriteLine("Three largest elements are " + first + " " + second + " " + third);

    }

    public static void Main()

    {

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

        int n = arr.Length;

        print3largest(arr, n);

    }

}

PHP

<?php

function print3largest($arr, $arr_size)

{

    $i; $first; $second; $third;

    if ($arr_size < 3)

    {

        echo " Invalid Input ";

        return;

    }

    $third = $first = $second = PHP_INT_MIN;

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

    {

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

        {

            $third = $second;

            $second = $first;

            $first = $arr[$i];

        }

        else if ($arr[$i] > $second)

        {

            $third = $second;

            $second = $arr[$i];

        }

        else if ($arr[$i] > $third)

            $third = $arr[$i];

    }

    echo "Three largest elements are ",

       $first, " ", $second, " ", $third;

}

$arr = array(12, 13, 1,

             10, 34, 1);

$n = count($arr);

print3largest($arr, $n);

?>

Javascript

<script>

function print3largest(arr, arr_size)

{

    let first, second, third;

    if (arr_size < 3)

    {

        document.write(" Invalid Input ");

        return;

    }

    third = first = second = Number.MIN_VALUE;

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

    {

        if (arr[i] > first)

        {

            third = second;

            second = first;

            first = arr[i];

        }

        else if (arr[i] > second)

        {

            third = second;

            second = arr[i];

        }

        else if (arr[i] > third)

            third = arr[i];

    }

    document.write("Three largest elements are "

        + first + " " + second + " "

        + third + "<br>");

}

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

    let n = arr.length;

    print3largest(arr, n);

</script>

Output

Three largest elements are 34 13 12

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

Method 2:

An efficient way to solve this problem is to use any O(nLogn) sorting algorithm & simply returning the last 3 largest elements.

C++

#include <bits/stdc++.h>

using namespace std;

void find3largest(int arr[], int n)

{

    sort(arr, arr + n);

    int check = 0, count = 1;

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

        if (count < 4) {

            if (check != arr[n - i]) {

                cout << arr[n - i] << " ";

                check = arr[n - i];

                count++;

            }

        }

        else

            break;

    }

}

int main()

{

    int arr[] = { 12, 45, 1, -1, 45, 54, 23, 5, 0, -10 };

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

    find3largest(arr, n);

}

C

#include <stdio.h>

#include <stdlib.h>

int cmpfunc(const void* a, const void* b)

{

    return (*(int*)a - *(int*)b);

}

void find3largest(int arr[], int n)

{

    qsort(arr, n, sizeof(int),

          cmpfunc);

    int check = 0, count = 1;

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

        if (count < 4) {

            if (check != arr[n - i]) {

                printf("%d ", arr[n - i]);

                check = arr[n - i];

                count++;

            }

        }

        else

            break;

    }

}

int main()

{

    int arr[] = { 12, 45, 1, -1, 45, 54, 23, 5, 0, -10 };

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

    find3largest(arr, n);

}

Java

import java.io.*;

import java.util.Arrays;

class GFG {

    void find3largest(int[] arr)

    {

        Arrays.sort(arr);

        int n = arr.length;

        int check = 0, count = 1;

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

            if (count < 4) {

                if (check != arr[n - i]) {

                    System.out.print(arr[n - i] + " ");

                    check = arr[n - i];

                    count++;

                }

            }

            else

                break;

        }

    }

    public static void main(String[] args)

    {

        GFG obj = new GFG();

        int[] arr = { 12, 45, 1, -1, 45, 54, 23, 5, 0, -10 };

        obj.find3largest(arr);

    }

}

Python3

def find3largest(arr, n):

    arr = sorted(arr)

    check = 0

    count = 1

    for i in range(1, n + 1):

        if(count < 4):

            if(check != arr[n - i]):

                print(arr[n - i], end = " ")

                check = arr[n - i]

                count += 1

        else:

            break

arr = [12, 45, 1, -1, 45,

       54, 23, 5, 0, -10]

n = len(arr)

find3largest(arr, n)

C#

using System;

class GFG {

    void find3largest(int[] arr)

    {

        Array.Sort(arr);

        int n = arr.Length;

        int check = 0, count = 1;

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

            if (count < 4) {

                if (check != arr[n - i]) {

                    Console.Write(arr[n - i] + " ");

                    check = arr[n - i];

                    count++;

                }

            }

            else

                break;

        }

    }

    public static void Main()

    {

        GFG obj = new GFG();

        int[] arr = { 12, 45, 1, -1, 45,

                      54, 23, 5, 0, -10 };

        obj.find3largest(arr);

    }

}

Javascript

<script>

     function find3largest(arr) {

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

        let check = 0, count = 1;

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

            if (count < 4) {

                if (check != arr[arr.length - i]) {

                    document.write(arr[arr.length - i] + " ");

                    check = arr[arr.length - i];

                    count++;

                }

            }

            else

                break;

        }

    }

    let arr = [ 12, 45, 1, -1, 45, 54, 23, 5, 0, -10 ];

    find3largest(arr);

</script>

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

Method 3:
We can use Partial Sort of C++ STL. partial_sort uses Heapselect, which provides better performance than Quickselect for small M. As a side effect, the end state of Heapselect leaves you with a heap, which means that you get the first half of the Heapsort algorithm “for free”. The complexity is “approximately” O(N log(M)), where M is distance(middle-first).

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    vector<int> V = { 11, 65, 193, 36, 209, 664, 32 };

    partial_sort(V.begin(), V.begin() + 3, V.end(), greater<int>());

    cout << "first = " << V[0] << "n";

    cout << "second = " << V[1] << "n";

    cout << "third = " << V[2] << "n";

    return 0;

}

Java

import java.io.*;

import java.util.Arrays;

class GFG{

  public static void main(String[] args)

  {

    int[] V = { 11, 65, 193, 36, 209, 664, 32 };

    Arrays.sort(V);

    int x = V.length;

    System.out.println("first = " + V[x-1] );

    System.out.println("second = " + V[x-2]);

    System.out.println("third = " + V[x-3] );

  }

}

Python3

V = [ 11, 65, 193, 36, 209, 664, 32 ];

V.sort()

V.reverse()

print(f"first =  {V[0]}");

print(f"second =  {V[1]}");

print(f"third =  {V[2]}");

C#

using System;

class GFG

{

public static void Main()

{

    int[] V = { 11, 65, 193, 36, 209, 664, 32 };

    Array.Sort(V);

    Array.Reverse(V);

    Console.WriteLine("first = " + V[0] );

    Console.WriteLine("second = " + V[1]);

    Console.WriteLine("third = " + V[2] );

}

}

Javascript

<script>

    let V = [ 11, 65, 193, 36, 209, 664, 32 ];

    V.sort((a, b) => a - b)

    V.reverse()

    document.write("first = " + V[0] + "<br>");

    document.write("second = " + V[1] + "<br>");

    document.write("third = " + V[2] + "<br>");

</script>

Output

first = 664
second = 209
third = 193

Time Complexity: O(n log m) where m is distance(middle-first).
Auxiliary Space: O(1)

Last Updated :
16 Nov, 2022

Like Article

Save Article

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

int buf;
int max;

for (int i = 1; i <= 20; ++i) {
    cout << "number " << i << ": ";
    cin >> buf;
    if (i == 1 || (i > 1 && buf > max)) {
        max = buf;
    }

}

cout << "Max: " << max;

diralik's user avatar

diralik

9,2956 золотых знаков23 серебряных знака57 бронзовых знаков

задан 21 окт 2018 в 9:56

Aplle's user avatar

4

Для трёх чисел выгоднее всего, видимо, создать буфер на три наибольших элемента (по сути – очередь по приоритетам), положить первые числа в правильном порядке, а дальше проверять, не больше ли очередное число, чем наименьшее число в буфере. Если да, то вытеснять наименьшее число, и вставлять новое в нужное место.

ответ дан 21 окт 2018 в 10:14

MBo's user avatar

MBoMBo

47.8k1 золотой знак17 серебряных знаков40 бронзовых знаков

13

#include <iostream>
using namespace std;

int main() {
    int Arr[20];

    for(int f=0; f <20; f++)
    {
        cin >> Arr[f];//ввод значений массива
    }
     for (int i = 0; i < 20; i++) { //сортировк
    for (int j = 0; j < 19; j++) {
      if (Arr[j] > Arr[j + 1]) {
        int b = Arr[j]; 
        Arr[j] = Arr[j + 1]; 
        Arr[j + 1] = b; 
      }
    }
  }
  for(int z=19; z >= 17; z--)
  cout <<Arr[z]<<endl;
    return 0;
}

ответ дан 21 окт 2018 в 10:19

spais's user avatar

spaisspais

4163 серебряных знака12 бронзовых знаков

2

«C ++ Последнее обновление: 28 августа 2018 г. 09:05:42 (UTC / GMT +8 часов)

script1adsense2code

script1adsense3code

C ++ Array: Упражнение-2 с решением

Напишите программу на C ++, чтобы найти три самых больших элемента в массиве.

Пример решения:

Код C ++:

#include<bits/stdc++.h>
using namespace std;
void three_largest(int arr[], int arr_size)
  {
   int i, first, second, third;
  
    if (arr_size < 3)
    {
        cout << "Invalid Input";
    }
  
    third = first = second = INT_MIN;
    for (i = 0; i < arr_size ; i ++)
    {
        if (arr[i] > first)
        {
            third = second;
            second = first;
            first = arr[i];
        }
         else if (arr[i] > second)
        {
            third = second;
            second = arr[i];
        }
  
        else if (arr[i] > third)
            third = arr[i];
    }
  
      cout << "nThree largest elements are: " <<first <<", "<< second <<", "<< third;
}
int main()
{
    int nums[] = {7, 12, 9, 15, 19, 32, 56, 70};
    int n = sizeof(nums)/sizeof(nums[0]);
    cout << "Original array: ";
    for (int i=0; i < n; i++) 
    cout << nums[i] <<" ";
   three_largest(nums, n);
    return 0;
}

Пример вывода:

 Исходный массив: 7 12 9 15 19 32 56 70 
Три крупнейших элемента: 70, 56, 32

Блоксхема:

«Блок-схема:

Редактор кода C ++:

Внесите свой код и комментарии через Disqus.

Предыдущий: Напишите программу на C ++, чтобы найти самый большой элемент из данного массива целых чисел.
Далее: Напишите программу на C ++, чтобы найти второй по величине элемент в данном массиве целых чисел.

Каков уровень сложности этого упражнения?

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense5code

disqus2code

script1adsense6code

script1adsense7code

script1adsense8code

uses crt;
const n=10;
var a:array [1..n] of integer;
i,max1,max2,max3,nmax1,nmax2,nmax3:integer;
begin
clrscr;
randomize;
writeln('Massive :');
for i:=1 to n do
begin
        a[i]:=random(100);
        write(a[i],' ');
end;
writeln;
max1:=-maxint;
max2:=-maxint;
max3:=-maxint;
for i:=1 to n do
if a[i]>max1 then
begin
        max1:=a[i];
        nmax1:=i;
end;
for i:=1 to n do
if a[i]>max2 then
if i<>nmax1 then
begin
        max2:=a[i];
        nmax2:=i;
end;
for i:=1 to n do
if a[i]>max3 then
if (i<>nmax1) and (i<>nmax2) then
begin
        max3:=a[i];
        nmax3:=i;
end;
writeln;
writeln('Max 1 = a[',nmax1,']=',max1);
writeln('Max 2 = a[',nmax2,']=',max2);
writeln('Max 3 = a[',nmax3,']=',max3);
 
readkey;
end.

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