Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 25 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 25.02.2009
Откуда: Калуга
написал прогу и вроде все работает только сортировку выводит только 1 цифру с повторением

листинг программы:

Public Class Form1
Dim stroc As String 'дополнительная переменная для обмена
Dim fon As Long, buk As Long 'дополнительные переменные для обмена
Dim A(0 To 10) As Integer
Dim j, i, k, p, Box, t, imax As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
stroc = TextBox1.Text
TextBox1.Text = TextBox2.Text
TextBox2.Text = stroc
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox2.BackColor = Color.DarkMagenta
GroupBox1.BackColor = Color.Gray
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
TextBox2.BackColor = Color.White
GroupBox1.BackColor = Color.Blue
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
TextBox3.Text = " "
Randomize()
ReDim A(0 To 10)
For i = 1 To 10
A(i) = Int(101 * Rnd())
TextBox3.Text = TextBox3.Text + " " + Str(A(i)) 'заполнение массива
Next i
End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
For t = 1 To 10
For j = 1 To 9 'организуем 9 просмотров массива
For i = 1 To 9 ' организуем просмотр массива с 1-го по 9-ый элемент
If A(i) > A(i + 1) Then
Call Exchange(i, i + 1) 'вызов процедуры Exchange
End If
' TextBox4.Text = TextBox4.Text + " " + Str(A(i))
Next i
' TextBox4.Text = TextBox4.Text + " " + Str(A(i))
Next j
TextBox4.Text = TextBox4.Text + " " + Str(A(i))
Next t
End Sub

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
For t = 1 To 10
For j = 1 To 9 ' организуем 9 просмотров массива
For i = 1 To 9 ' организуем просмотр массива с 1-го по 9-ый элемент
Call max() ' вызов процедуры Max
Next i
Next j
TextBox5.Text = TextBox5.Text + " " + Str(A(j))
Next t
End Sub

Private Sub max()
imax = j
For i = j To 10
If A(i) > A(imax) Then
imax = i
End If
Next i
End Sub

Private Sub Exchange(ByVal k As Integer, ByVal p As Integer)
Box = A(k)
A(k) = A(p)
A(p) = Box
End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
TextBox3.Clear()
TextBox4.Clear()
TextBox5.Clear()
End Sub
End Class

_________________
ESTO QUOD ESSE VIDERIS
"Ты должен быть тем, кем кажещься"]



Партнер
 

Junior
Статус: Не в сети
Регистрация: 17.08.2010
Думаю, вот так оно будет лучше работать - метод пузырьковой сортировки

Код:
Private A(1 To 10) as long

Private Sub Command1_Click()
    Randomize
    For i = 1 To 10
        A(i) = Int(101 * Rnd())
    Next i
End Sub

Private Sub Command2_Click()
dim t as boolean
dim j as long
t = True
Do While t
  t = False
  For j = 1 To 9
    If A(j) > A(j + 1) Then
        Call Exchange(j, j + 1)
        t = True
    End If
  Next j
Loop
End Sub

Private Sub Exchange(ByVal k As Integer, ByVal p As Integer)
    Box = A(k)
    A(k) = A(p)
    A(p) = Box
End Sub


 

Member
Статус: Не в сети
Регистрация: 30.09.2006
Откуда: Ростов-на-Дону
Нужен алгоритм, который ищет в массиве заданное количество минимальных элементов
и выводит их номера в другой массив. Проблема в том, что
1) Массив не желательно копировать/портить, поэтому алгоритмы сортировки не подходят, да и избыточны они
(мне нужно, скажем, 3 элемента, а сортировщик отсортирует все)
2) Хотелось бы получить результат за один проход.
3) Работать должно как можно быстрее, скорость - главное.

Пока вот что сочинил

Код:
public void Sort(int[] a, int[] I)
        {
            int min = a[0];
            int j = 0;

            for (int i = 1; i < a.Length; i++)
            {
                if (a[i] <= min)
                {
                    min = a[i];
                    I[j++ % I.Length] = i;
                }
           
            }
       
        }


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

_________________
Я знаю, что ничего не знаю. Но некоторые не знают даже этого!


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 23.01.2005
Откуда: с Марса
DeaDRaiN
зы , если у тебя траблы с таблицами , то нужно обратно вернутся к бумажке и нарисовать , то что ты хочешь...
Ибо в программировании это просто инструмент и не более того.
Это как, закруть гайку, есть ключ, но я не знаю где его луше взять... ;)

_________________
Монитор никак у всех, у меня на IPS.
Пpошьешь и бедное железо на совсем убьешь ! Не уверен , не прошивай !
Пниха Виста
Колбоса
КГ / АМ


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
а что нибудь про массив известно, типа какое у него распределение? расход памяти не критичен? могу предложить такой вариант, который подошёл бы для равномерного распределения:
1. найти минимум и максимум
2. поделить длину исходного массива на количество элементов, которые надо извлечь, и помножить это число на некоторый коэффициент, подобранный эмпирически. скажем, 3.
3. поделить интервал на число, полученное в предыдущем пункте, это будет новая верхняя граница. пробежать массив второй раз и запихнуть в выходной массив индексы всех элементов, значения которых меньше этой новой верхней границы
4. отсортировать массив из предыдущего пункта по значению (не по индексу) и взять меньше 3 элемента

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


 

Member
Статус: Не в сети
Регистрация: 30.09.2006
Откуда: Ростов-на-Дону
ToSHiC писал(а):
типа какое у него распределение?

Гаусово, но с неизвестными характеристиками.
ToSHiC писал(а):
с высокой долей вероятности, которая зависит от распределения и коэффициента в п.2 эти 3

Нужно со 100%. Кроме того, длина массива и требуемое число выводимых номеров минимальных элементов
должно меняться, и эмперически подбирать коэффициенты под каждый случай не хочется.

_________________
Я знаю, что ничего не знаю. Но некоторые не знают даже этого!


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
vo1

А почему сначала просто не найти минимальный элемент за 1 проход. А потом искать элемент, который будет минимальным, но больше или равен тому, который был найден в прошлый раз?


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 23.01.2005
Откуда: с Марса
ToSHiC
Цитата:
расход памяти не критичен?

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

_________________
Монитор никак у всех, у меня на IPS.
Пpошьешь и бедное железо на совсем убьешь ! Не уверен , не прошивай !
Пниха Виста
Колбоса
КГ / АМ


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
D_A_R писал(а):
А почему сначала просто не найти минимальный элемент за 1 проход. А потом искать элемент, который будет минимальным, но больше или равен тому, который был найден в прошлый ра
з?


Написал на Java за 10 минут. Столько проходов по массиву, сколько элементов надо найти. Ну и не делал проверку на два одинаковых минимальных элемента. Но там не сложно, просто следить за индексами.


 

Member
Статус: Не в сети
Регистрация: 30.09.2006
Откуда: Ростов-на-Дону
D_A_R писал(а):
А почему сначала просто не найти минимальный элемент за 1 проход. А потом искать элемент, который будет минимальным, но больше или равен тому, который был найден в прошлый раз?


Моя нынешняя реализация работает так: копируется массив, затем ищется минимальный элемент с индексом,
затем на этом индексе выставляется большое число (int.MaxValue). Потом опять в этом же массиве
производится поиск минимального элемента и так нужное количество раз.

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

D_A_R писал(а):
3 прохода по массиву

Какое количество минимальных элементов? А если больше 3?

Присочинил тут такой алгоритм
Код:
public void Sort(int[] a, int[] I)
        {
            int[] min = new int[I.Length];
            min[0] = a[0];
           
            for (int i = 1; i < min.Length; i++)
               min[i] = int.MaxValue;
           
           
            int j = 0;
            for (int i = 1; i < a.Length; i++)
            {
                if (a[i] <= min[0])
                {
                    min[0] = a[i];
                    I[0] = i;
                }

                for (j = 1; j < min.Length; j++)
                    if ((a[i] > min[j - 1]) && (a[i] <= min[j]))
                    {
                        min[j] = a[i];
                        I[j] = i;
                    }
            }
       
        }


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

Цитата:
Столько проходов по массиву, сколько элементов надо найти

А, понятно. Это плохо...

_________________
Я знаю, что ничего не знаю. Но некоторые не знают даже этого!


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
vo1 писал(а):
По поводу больше или равен - если я такое условие поставлю, то все время буду ловить один и тот же элемент -нужно еще дополнительно указывать проверку, не является ли мой индекс одним из найденныхмной индексов. А это не желательно, т.к. усложняет программу.


Просто больше.
Если есть повторяющиеся элементы, то индексы все равно надо(если массив не портить). Хотя есть и другие варианты запоминания элементов, которые уже встречались.


vo1 писал(а):
Какое количество минимальных элементов? А если больше 3?


Ступил. Проходов столько, сколько элементов надо найти. Уже поправил пост.

vo1 писал(а):
Но этот алгоритм работает только если минимальные элементы расположены в порядке убывания.

vo1 писал(а):
Идеальный вариант программы должен иметь сложность примерно как то что я в первый раз выложил

По-моему это не реально без сортировки.


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
BiC писал(а):
ToSHiC
Цитата:
расход памяти не критичен?

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

а что, кроме как под x86 уже больше ни подо что не надо писать код?:) ну и количество массивов бывает разное + возможно планируется некоторая оптимизация с целью попадания в кэш процессора и т.д.
vo1 писал(а):
Цитата:
Столько проходов по массиву, сколько элементов надо найти

А, понятно. Это плохо...

мне кажется, алгоритма со сложностью O(n) не получится. я вот только тот придумал, что выше написал


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
vo1 писал(а):
А, понятно. Это плохо...

Это смотря какое соотношение количества всех элементов и искомых.


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
кстати, у квиксорта сложность O(n log n), так что если длина первого массива не очень большая и надо извлечь как минимум несколько значений - то сортировка может даже и быстрее будет работать


 

Member
Статус: Не в сети
Регистрация: 30.09.2006
Откуда: Ростов-на-Дону
D_A_R писал(а):
если массив не портить

Кстати, его можно испортить, запомнить в отдельном массиве то, что мы испортили,
а в конце испорченные элементы обратно восстановить.

Ладно, если нельзя без кучи проходов, значит нельзя. Хоть мой последний алгоритм имеет один проход,
внутренний цикл убивает это преимущество. Есть вариант использовать метод быстрой сортировки,
но он будет давать преимущество для довольно больших значений выбираемых элементов (надо опыты поставить, может это большое число равно двум), да и придется крутить два массива сразу (один исходный, другой - с индексами, изначально заданными по порядку).
Кроме того, нужно проверить, является ли этот алгоритм "тормозом" программы. Ведь количество операций
при увеличении количества элементов для этого алгоритма растет линейно, а для остальной части программы как
2^p, где p - количество минимальных элементов. Скажем, для p = 0..3 этот алгоритм может оказывать существенное
влияние, а для p > 5 вряд ли имеет большое значение. Но, тем не менее, функция должна будет вызываться кучу раз
и должна быть максимально "вылизана" каждая ее часть.

Кстати, длина массива от 8 до 128.

Цитата:
а что, кроме как под x86 уже больше ни подо что не надо писать код?:) ну и количество массивов бывает разное + возможно планируется некоторая оптимизация с целью попадания в кэш процессора и т.д.

В финале операции, которые делает эта программа, должен будет выполнять микроконтроллер/ПЛИС.
Пока у меня знаний на это не хватает, от меня требуется просто сделать ее на C#.

_________________
Я знаю, что ничего не знаю. Но некоторые не знают даже этого!


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 23.01.2005
Откуда: с Марса
ToSHiC
Ха, а тебе java что нибудь говорит ? Там пох , для какой ос/платформы пишешь.
И причем здесь архитектура процессора ? Мы опять же, не в 80ых. Не на ассамлёре же пишем ...

_________________
Монитор никак у всех, у меня на IPS.
Пpошьешь и бедное железо на совсем убьешь ! Не уверен , не прошивай !
Пниха Виста
Колбоса
КГ / АМ


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
vo1 писал(а):
Ладно, если нельзя без кучи проходов, значит нельзя


?

Код:
public void Sort(int[] a, int[] I)
{
   int min = a[0];
   I[0] = 0;
   int j = 1;
      
   for (int i = 1; i < a.Length; i++)
   {
      if (a[i] <= min)
      {
         if (a[i] < min)
         {
            min = a[i];
            j = 0;
         }

         I[j++] = i;                   
      }
   }   
}


В итоге j == числу минимальных элементов массива а[].
Бери сколько надо индексов из массива I[].


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
BiC писал(а):
ToSHiC
Ха, а тебе java что нибудь говорит ? Там пох , для какой ос/платформы пишешь.
И причем здесь архитектура процессора ? Мы опять же, не в 80ых. Не на ассамлёре же пишем ...

то есть для микроконтроллеров с несколькими килобайтами памяти на борту тоже на жаве будешь писать и пофиг на память? и для видюх на cuda/opencl, где вполне может быть всего 16 килобайт памяти на мультипроцессор?


 

Member
Статус: Не в сети
Регистрация: 30.09.2006
Откуда: Ростов-на-Дону
zauropod
Алгоритм неверен: что, если минимальный элемент окажется самым первым?
Условие (a[i] <= min) никогда не будет выполнено.

Ладно, спасибо за помощь :beer: . Оказалось, этот алгоритм не является слабым местом,
поэтому его оптимизацией займусь в последнюю очередь (наверное, применю быструю сортировку).

_________________
Я знаю, что ничего не знаю. Но некоторые не знают даже этого!


 

Advanced member
Статус: Не в сети
Регистрация: 16.11.2006
Откуда: Всегда!
vo1 писал(а):
Алгоритм неверен: что, если минимальный элемент окажется самым первым?

Ваше утверждение неверно.
Внимательно посмотрите на первые три строчки.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 25 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  

Лаборатория














Новости

Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan