(С#)Нахождение третьего по величине числа массива
Имеется следующая задача: "В массиве целых чисел (не более 100 элементов), не превосходящих по модулю 1000 и среди которых нет равных, найти порядковый номер третьего по величине числа.
Например: Число чисел 10
1-е 1 2-е 6 3-е 7 4-е -51 5-е -10 6-е -16 7-е 71 8-е 53 9-е 11 10-е -13
Ответ: третье по величине число имеет порядковый номер 9.
Т.е. первое, самое большое число - 71, второе - 53, а третье - 11
Но как показать именно порядковый номер и как найти третье число? Пока вот нашел только максимальный элемент.
namespace ConsoleApplication1 ; int figure_from_top = 3;
int max = arr[0]; int min = arr[0];
for ( int i = 1; i < arr_size; i++ )
int k = -1; for ( int j = 0; j < figure_from_top - 1; j++ )
Console.WriteLine("Индекс третьего по величине элемента: "+ string.Parse(k))
Вводим размер массива.По условию массив не задан.Не надо упрощать условие.Заполняем массив случайными числами в диапазоне от -1000 до 1000.Делаем копию массива.Сортируем массив по убыванию. Третий по величине элемент имеет индекс 2.Ищем в копии его индекс.
. ulong n = 0; Console.WriteLine("Введите размер массива"); n = Convert.ToUInt64(Console.ReadLine()); Console.WriteLine("\n\tЗаполняем массив случайными цифрами от -1000 до 1000"); int[] array = new int[n]; int[] mass = new int[n]; Random r = new Random(); int length = array.Length; Console.Write("\n"); for (int i = 0; i < length; i++) Console.WriteLine("\n\tИсходный массив. \n"); foreach (int i in array) Console.Write("\n"); int temp = 0; for (int j = 0; j < length; j++) Console.WriteLine("\n\tСортированный по убыванию массив. \n"); foreach (int i in array) int val = 2; Console.WriteLine("\nТретье по величине число равно : " + array[val].ToString()); for (int i = 0; i < length; i++) .
P.S. если что-то не так прошу прощения поскольку в изучение C# только начал углубляться.
А почему сортировка в приведенном коде идет полностью? Предлагается, например, сортировать по возрастанию, и сортировать, как и в приведенном коде, от начала к концу. При такой сортировке после первой итерации уже определится максимальный элемент (он будет последним в массиве), после второй итерации - второй по величине элемент, а после третьей - искомый третий по величине. Дальше сортировать нет смысла!
. ulong n = 0; Console.WriteLine("Введите размер массива"); n = Convert.ToUInt64(Console.ReadLine()); Console.WriteLine("\n\tЗаполняем массив случайными цифрами от -1000 до 1000"); int[] array = new int[n]; int[] mass = new int[n]; Random r = new Random(); int length = array.Length; Console.Write("\n"); for (int i = 0; i < length; i++) Console.WriteLine("\n\tИсходный массив. \n"); foreach (int i in array) Console.Write("\n"); int temp = 0; for (int j = 0; j < 3; j++) Console.WriteLine("\nТретье по величине число равно : " + array[length-3].ToString()); for (int i = 0; i < length; i++) .
A вы уверенны, что ваша идея с дополнительным массивом и сортировкой намного эффективней? Особенно, если использовать Пузырек - помоему больше проходов по массиву будет, если сделать как говорит cheburator - лучше и приблизительно тот же эффект, что и у koltaviy. А вспомогательные массивы у нас при таких задачах как правило запрещались.
Решение koltaviy, просто немного изменила:
static void Main(string[] args) ; int figure_from_top = 3; int top_level; int max_i = 0; int min_i = 0;
for ( int i = 1; i < arr.Length; i++ ) if (arr > arr[max_i]) max_i = i; else if (arr < arr[min_i]) min_i = i;
for ( int j = 0; j < figure_from_top - 1; j++ )
Console.WriteLine("Порядковый номер третьего по величине элемента: " + (max_i+1));
#define min -100 #define mas 10 #define num 3
for(m = 0; m < num; m++) for(i = 0, m2 = min; i < mas; i++, m1[k] = min) if( m1 > m2) m2 = m1[k = i];
barracuda, интересное решение, только min помоему лучше взять -1000(по условию задачи числа не превышает тысячи по модулю) и конечно надо делать копию массива источника, а то он теряется.
А твой предыдущий вариант решения лучше удалить - оно не нужно :)
про дополнительный массив в условии ничего не сказано, а раз ничего не сказано, то решили применить: почему нет, раз не запрещено. далее сам автор почему-то не уделил внимания формированию массива, хотя в условии ясно сказано, что он неизвестен и кол-во элементов в нем неизвестно значит должен формироваться динамически, и существует условие о его содержимом, поэтому начали рассматривать задачу с самого начала, а не только поиск индекса. т.к. дали ему задание реализовать на C#, то и решено было задействовать именно возможности предоставляемые этим языком программирования. если говорить об эффективности, то для количества элементов равного 100, вопрос о том, применять тот код или иной, не имеет смысла. я проверил для 100000 элементов и могу заверить, что код m_Valery + kosfiz + cheburator выполняется за столько же времени за сколько koltaviy + OlgaKr. причем если рассматривать оптимизацию кода написанного в совокупности m_Valery + kosfiz + cheburator, то сортировку надо проводить как написал cheburator, далее лучше не писать в цикле формирования массива