Сортировка массивов в Bisual Basic 2008

Дата изменения: 12 июля 2018

* Задание: Разработать приложение, которое сортирует предложенный массив целых чисел из некоторого интервала по возрастанию.

Выполнение:

  1. Рассмотрим задачу упорядочивания массива в простейшей постановке: дан числовой массив х1, …, хn, элементы которого попарно различны, требуется переставить элементы массива так, чтобы после перестановки они были упорядочены в порядке возрастания: х1< … < хn. Опишем алгоритм решения этой задачи.
  2. Используем алгоритм сортировки выбором. Суть его такова: очевидно, что первое место в массиве должен занять наименьший элемент, второе – наименьший из всех остальных элементов и т.д. Пусть x1, …, xi-1 уже получили нужные значения. Тогда определение индекса k наименьшего из
    xi
    , xi+1, … xn и перестановка xi c xk приведут к тому, что x1, …, xi будут иметь нужные значения. Составим программу для этого алгоритма.
  3. Создайте новый проект и разместите элементы управления (txtN, txtMin, txtMax, lblИсходныйМассив, lblРезультат, btnНовыйМассив, btnСортировка и btnВыход) на форме так, как показано на рисунке (рисунок). Используйте элемент GroupBox для группировки.

Форма «Сортировка массива»

  1. Установите значение для свойства
    Enabled
    кнопки btnСортировка равным False (т.о., заблокировав кнопку).
  2. Самостоятельно запрограммируйте кнопку Выход.
  3. В разделе описаний объявите динамический массив следующим образом:
Private Массив() As Integer
  1. Теперь необходимо инициализировать наш массив целыми числами из некоторого промежутка. Процедура обработки события Click для кнопки btnНовыйМассив выглядит следующим образом:
Private Sub btnНовыйМассив_Click(…) Handles btnНовыйМассив.
Click Dim n As Integer = Val(txtN.Text) Dim a As Integer = Val(txtMin.Text) Dim b As Integer = Val(txtMax.Text) ReDim Массив(0 To n) If Not n >= 1 Or b < a Then MsgBox("Введены ошибочные параметры массива!", MsgBoxStyle.Critical, "Ошибка!") Exit Sub End If Randomize() For i = 1 To n массив(i) = Rnd() * (b - a) + a lblИсходныйМассив.Text = lblИсходныйМассив.Text & Массив(i) If i <> n Then lblИсходныйМассив.Text = lblИсходныйМассив.Text & "," Next btnСортировка.Enabled = True End Sub
  1. Наконец, реализуем описанный выше алгоритм сортировки в процедуре обработки события Click
    для кнопки btnСортировка. Предварительно опишем функцию НомерМинимума, которая осуществляет поиск позиции минимального элемента массива:
Private Function номерМинимума(ByVal x() As Integer, ByVal m As Integer) As Integer
' номер минимума в массиве х ищется начиная с х(m)-го элемента
Dim min As Integer = x(m) 'min присваиваем сначала первый элемент массива, затем второй и т. д.
Dim NumberMin As Integer = m
Dim i As Integer
For i = m To UBound(x) ' верхний индекс массива
  If x(i) < min Then min = x(i) : NumberMin = i
Next
номерМинимума = NumberMin
End Function
  1. Теперь опишем главный фрагмент кода, который вызывает функцию поиска позиции минимума, начиная с нулевой позиции массива; затем, после выполнения функции, на нулевое место становится минимальный элемент, а функция вызывается с аргументом уже первой (а не нулевой) позиции (затем второй позиции и т.д.):
Private Sub btnСортировка_Click(…) Handles btnСортировка.Click
Dim i As Integer
Dim k As Integer
Dim t As Integer
For i = LBound(Массив) To UBound(Массив)
  k = номерМинимума(Массив, i)
  t = Массив(i)
  Массив(i) = Массив(k) 'при первом заходе в цикл на первую позицию массива ставим минимальный элемент
  Массив(k) = t
Next
For i = LBound(Массив) To UBound(Массив)
  lblРезультат.Text = lblРезультат.Text & Массив(i)
  If i <> UBound(Массив) Then lblРезультат.
Text = lblРезультат.Text & "," Next btnСортировка.Enabled = False End Sub

Как Вы заметили, в данном коде вместо точного указания границ массива в цикле For используются значения свойств массива LBound и UBound. В них хранится, соответственно, нижняя и верхняя граница диапазона индексов массива. Использование этих свойств в программе позволяет автоматизировать работу с массивом в случае добавления или удаления его элементов.

  1. Запустите и отладьте приложение. Вы, очевидно, заметили, что программа начинает некорректно работать при повторном нажатии на кнопку Новый массив. Для того чтобы выправить эти дефекты, создадим процедуру ОчисткаОкон:
Private Sub ОчисткаОкон()
lblИсходныйМассив.Text = ""
lblРезультат.Text = ""
btnСортировка.Enabled = False
End Sub
  1. Вызовем созданную подпрограмму в начале процедуры обработки события Click для кнопки btnНовыйМассив, а также в процедурах обработки события Change для текстовых окон txtN, txtMi
    n и txtMax следующим образом:
Call ОчисткаОкон()
  1. Запустите и отладьте приложение.

Дополнительное задание:

Самостоятельно разработать программу для реализации алгоритма сортировки вставками. Суть этого алгоритма в следующем: просматриваются последовательно элементы массива х2, …, хn и каждый новый элемент xi вставляется на подходящее место в уже упорядоченную совокупность

x1, …, xi-1. Это место определяется последовательным сравнением xiс упорядоченными элементами x1, …, xi-1. При решении этой задачи необходимо описать и использовать функцию УпорядоченнаяВставка, которая вставляет xiна подходящее место в уже упорядоченную последовательность x1, …, xi-1.

Вопросы для самоконтроля:

  1. Какие алгоритмы сортировок Вы знаете? Опишите один их них.
  2. Для чего используются свойства массива LBound и UNound?
  3. Как передать массив в процедуру в качестве параметра?

* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.

Разместил admin / 17 апреля, 2017 / 0 Комментарии

Рубрики:

Программирование объектно-ориентированное (визуальное), Visual Basic (VB 2008)

Практическое руководство. Сортировка массива по локали в PHP | Tom McFarlin

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

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

Очевидно, что в разных регионах используются разные алфавиты, поэтому то, что работает, скажем, в США, не обязательно будет работать в Германии.

Есть несколько способов справиться с этим, но самый простой способ, который я нашел, — это использовать класс Collator PHP.

Сортировка массива по локали в PHP

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

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

Как насчет setlocale?

Прежде чем я расскажу больше о Collator, стоит упомянуть, что многие, если не большинство, примеров и учебных пособий в Интернете, в которых рассказывается о сортировке данных на языке, отличном от того, что находится на сервере (или в приложении, если оно указано уникальное) заключается в использовании PHP-функции `setlocale`.

Функция работает очень просто:

  • Вы указываете категорию, которая повлияет на категорию функций сортировки. Обычно я использую LC_COLLATE, а если использую что-то еще, то LC_ALL.
  • Вы указываете языковой стандарт для языка, который хотите преобразовать.

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

Например, ознакомьтесь со следующим содержанием:

Достаточно легко понять, не так ли?

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

Класс Collator

Здесь класс Collator оказывается очень кстати. Если вы знакомы с приведенным выше синтаксисом, то его действительно легко использовать.

Но сначала, согласно руководству по PHP, класс Collator определяется следующим образом:

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

Звучит именно так, как нужно, не так ли?

Допустим, у меня есть массив фамилий, и я хочу отсортировать их по алфавиту, используя немецкую локаль. Чтобы использовать Collator, я бы сделал так:

Не сильно отличается, не так ли? Конечно, главное отличие состоит в том, что этот класс — по крайней мере, по моему опыту — обрабатывает международные алфавиты и их порядок лучше, чем `setlocale`.