3672

Алгоритми сортування в одновимірних масивах

Лекция

Информатика, кибернетика и программирование

Алгоритми сортування в одновимірних масивах Найпростіше завдання сортування полягає в упорядкуванні елементів масиву по зростанню або убуванню. Іншим завданням є впорядкування елементів масиву відповідно до деякого критерію. Звичайно як такий критер...

Украинкский

2012-11-05

42.5 KB

47 чел.

Алгоритми сортування в одновимірних масивах

Найпростіше завдання сортування полягає в упорядкуванні елементів масиву по зростанню або убуванню. Іншим завданням є впорядкування елементів масиву відповідно до деякого критерію. Звичайно як такий критерій виступають значення певної функції, аргументами якої виступають елементи масиву. Цю функцію прийнято називати функцією, що впорядковує.

Існують різні методи сортування. Будемо розглядати кожний з методів на прикладі завдання сортування по зростанню масиву з N цілих чисел.

Сортування вибором

Ідея методу полягає в тім, що перебуває максимальний елемент масиву й міняється місцями з останнім елементом (з номером N). Потім, максимум шукається серед елементів з першого до передостаннього й ставиться на N-1 місце, і так далі. Необхідно знайти N-1 максимум. Можна шукати не максимум, а мінімум і ставити його на перше, друге й так далі місце. Також застосовують модифікацію цього методу з одночасним пошуком максимуму й мінімуму. У цьому випадку кількість кроків зовнішнього циклу N div 2.

Обчислювальна складність сортування вибором - величина порядку N*N, що звичайно записують як O(N*N). Це порозумівається тим, що кількість порівнянь при пошуку першого максимуму дорівнює N-1. Потім N-2, N-3, і так далі до 1, разом: N*(N-1)/2.

Приклад 22.1.: Сортування вибором по зростанню масиву A з N цілих чисел.

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n + 2];

Random r = new Random();

int i;

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

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

for (i = n; i >= 2; i--)

{

int i1 = 1; //{ m - місце max }

for (int j = 2; j <= i; j++)

if (a[j] > a[i1]) i1 = j;

//міняємо місцями елементи з номером m і номером k}

int x = a[i1]; a[i1] = a[i]; a[i] = x;

for (int k = 1; k <= n; k++)

{

Console.Write(a[k] + " ");

}Console.WriteLine();

}

Console.ReadLine();

Приклад 22.2. : Те ж завдання з одночасним вибором max й min.

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n + 2];

Random r = new Random();

int i;

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

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

for (i = 1; i <= n/2 ; i++)

//{max й min шукаються серед елементів з i до n-i+1}

{

int i1 = i; //{ - місце max }

int i2 = i; //{ - місце min }

for (int j = i + 1; j <= n - i + 1; j++)

{

if (a[j] > a[i1]) i1 = j;

if (a[j] < a[i2]) i2 = j;

}

Console.WriteLine(a[i1] + " " + i1 + " " + a[i2] + " " + i2);

//міняємо місцями елементи з номером i1 і номером i}

int x = a[i2]; a[i2] = a[i]; a[i] = x;

//якщо max стояв на місці i, то зараз він на місці i2;

if (i1==i) i1=i2;

//міняємо місцями елементи з номером i1 і номером n-k+1

x = a[i1]; a[i1] = a[n - i + 1]; a[n - i + 1] = x;

for (int k = 1; k <= n; k++)

{

Console.Write(a[k] + " ");

}Console.WriteLine();

}

Сортування обміном (методом "пухирця")

Ідея методу полягає в тім, що послідовно рівняються пари сусідніх елементів масиву. Якщо вони розташовуються не в тім порядку, то робимо перестановку, міняючи місцями пари сусідніх елементів. Після одного такого проходу на останнім місці номер N виявиться максимальний елемент ("сплив" перший "пухирець"). Наступний прохід повинен розглядати елементи до передостаннього й так далі. Усього потрібно N-1 прохід. Обчислювальна складність сортування обміном O(N*N).

Приклад 22.3. Сортування обміном по зростанню масиву A з N цілих чисел. (Базовий варіант)

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n + 2];

Random r = new Random();

int i;

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

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

for (i = 1; i <= n - 1; i++)

{

for (int j = 1; j <= n - 1; j++)

{

if (a[j] > a[j + 1])

{

int x = a[j]; a[j] = a[j + 1]; a[j + 1] = x;

}

}

for (int k = 1; k <= n; k++)

{

Console.Write(a[k] + " ");

} Console.WriteLine();

}

Console.ReadLine();

Можна помітити, що якщо при виконанні чергового проходу в сортуванні обміном не зроблений ні однієї перестановки, те це означає, що масив уже впорядкований. Таким чином, можна модифікувати алгоритм, щоб наступний прохід робився тільки при наявності перестановок у попередньому.

Приклад 22.4. : Сортування обміном з перевіркою факту перестановки.

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n + 2];

Random r = new Random();

int i;

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

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

int l = n - 1;

int f = 1;

while (f == 1)

{

f = 0;

for (int j = 1; j <= l; j++)

if (a[j] > a[j + 1])

{

int x = a[j]; a[j] = a[j + 1]; a[j + 1] = x; f = 1;

}

l = l - 1;

for (int k = 1; k <= n; k++)

{

Console.Write(a[k] + " ");

} Console.WriteLine();

}

Console.ReadLine();

Наступна модифікація алгоритму сортування обміном виходить при запам'ятовуванні місця останньої перестановки. Якщо при черговому проході останньою парою елементів, які помінялися місцями, були A[i] й A[i+1], то елементи масиву з i+1 до останнього вже коштують на своїх місцях. Використання цієї інформації дозволяє нам зробити кількість пар для наступного проходу рівним i-1.

Приклад 22.5. : Сортування обміном із запам'ятовуванням місця останньої перестановки.

Console.WriteLine("Введите число ");

int n = Int32.Parse(Console.ReadLine());

int[] a = new int[n + 2];

Random r = new Random();

int i;

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

{

a[i] = r.Next(100);

Console.Write(a[i] + " ");

}

Console.WriteLine();

int l = n - 1;

while (l>0)

{

int m = 0;

for (int j = 1; j <= l; j++)

if (a[j] > a[j + 1])

{

int x = a[j]; a[j] = a[j + 1]; a[j + 1] = x; m = j;

}

l = m - 1;

for (int k = 1; k <= n; k++)

{

Console.Write(a[k] + " ");

} Console.WriteLine();

}

Console.ReadLine();


 

А также другие работы, которые могут Вас заинтересовать

13662. Алкоголизм и преступление -это два явления общественной жизни, находящиеся в тесной связи друг с другом 14.11 KB
  Алкоголизм и преступление это два явления общественной жизни находящиеся в тесной связи друг с другомИ. МержевскийПоведение людей в обществе определяется прежде всего тем на какие ценности они равняются каких ценностей они придерживаются. Для стабильности и единс
13663. Берне Л. Без многого может обойтись человек, только не без человека 15.56 KB
  Без многого может обойтись человек только не без человека Л. Берне Я считаю что высказывание Людвига Берне немецкого публициста и писателя о том что без многого может обойтись человек только не без человека верно и сохраняет свою актуальность сегодня поскольку о
13664. Жениться - это значит наполовину уменьшить свои права и вдвое увеличить свои обязанности 16.27 KB
  Жениться это значит наполовину уменьшить свои права и вдвое увеличить свои обязанности. А. Шопенгауэр А. Шопенгауэр выдающийся философ нового времени был пессимистом. Он считает что женитьба и создание семьи лишь увеличивает обязанности. Семья это объединени...
13665. Индивидом рождаются, личностью становятся, индивидуальность – отстаивают 16.52 KB
  Индивидом рождаются личностью становятся индивидуальность – отстаивают. А.Г.Асмолов Личностью не родятся личностью становятся. А.Н. Леонтьев Фундаментальная цель жизни человека – развить и выразить себя. Но ребенок не самодостаточен. Он слаб и физически и духовно ...
13666. Дарендорф. Кто умеет справиться с конфликтами путем их признания, берет под свой контроль ритм истории 14.32 KB
  Кто умеет справиться с конфликтами путем их признания берет под свой контроль ритм истории. Р.Дарендорф. Зададимся вопросом: А что значит конфликт Ученые дают такие варианты определений Конфликты представляют собой особый тип социального взаимодействия субъе...
13667. Личность – это человек как носитель сознания 13.9 KB
  Личность – это человек как носитель сознания К.К. ПлатоновЧеловек вечная проблема. Наши предки считали что человек предназначен для жизни бесконечной. И что свою суть он должен познавать в течение всей свой земной жизни а может быть и за пределами ее. И сейчас немало ...
13668. Личность человека, ни в каком смысле не является предсуществующей по отношению к его деятельности, как и его сознание, она ею порождается 13.85 KB
  Личность человека ни в каком смысле не является предсуществующей по отношению к его деятельности как и его сознание она ею порождается А.Н. ЛеонтьевЛеонтьев Алексей Николаевич советский психолог занимавшийся проблемами сознания и деятельности.Личность это конкр
13669. Люди рождаются только с чистой природой, лишь потом отцы делают их иудеями, христианами или огнепоклонниками 14.77 KB
  Люди рождаются только с чистой природой лишь потом отцы делают их иудеями христианами или огнепоклонниками. Саади Сложно не согласиться с данным высказыванием. Человек существо биосоциальное. От рождения мы обладаем по словам поэта Саади чистой природой. Мале...
13670. Люди существуют друг для друга 16.04 KB
  Люди существуют друг для друга Марк АврелийЧеловек по своей природе существо социальное. Такими нас сделала природа: с самых древних времен люди живут социумом т.е. коллективом. И даже когда не было создано речи люди общались с помощью жестов и звуков. Человек не мож