Лабораторная работа 16-17 (1). Московский политехнический университет
Скачать 48.23 Kb.
|
федеральное государственное автономное образовательное учреждение высшего образования МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ (ВЫСШАЯ ШКОЛА ПЕЧАТИ И МЕДИАИНДУСТРИИ) (Факультет информационных технологий) (Институт Принтмедиа и информационных технологий) Кафедра Информатики и информационных технологий направление подготовки 09.03.02 «Информационные системы и технологии» ЛАБОРАТОРНАЯ РАБОТА № 16-17 Дисциплина: Основы алгоритмизации и программирования (первый курс, первый семестр). Тема: Работа со списками Выполнил: студент группы 221-721 Худаёров Акромбек Ахмад угли (Фамилия И.О.) Дата, подпись ________________ ___________ (Дата) (Подпись) Проверил: _________________________ ___________ (Фамилия И.О., степень, звание) (Оценка) Дата, подпись ________________ ___________ (Дата) (Подпись) Замечания: _________________________________________________________ __________________________________________________________________ Москва2023 Лабораторная работа №16-17 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int n, a[n]; //n - количество элементов void qs(int* s_arr, int first, int last) { int i = first, j = last, x = s_arr[(first + last) / 2]; do { while (s_arr[i] < x) i++; while (s_arr[j] > x) j--; if(i <= j) { if (s_arr[i] > s_arr[j]) swap(&s_arr[i], &s_arr[j]); i++; j--; } } while (i <= j); if (i < last) qs(s_arr, i, last); if (first < j) qs(s_arr, first, j); } |
Исходный вызов функции qs для массива из n элементов будет иметь следующий вид.
1 | qs(a, 0, n-1); |
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 | int partition (int[] array, int start, int end) { int marker = start; for ( int i = start; i <= end; i++ ) { if ( array[i] <= array[end] ) { int temp = array[marker]; // swap array[marker] = array[i]; array[i] = temp; marker += 1; } } return marker - 1; } void quicksort (int[] array, int start, int end) { if ( start >= end ) { return; } int pivot = partition (array, start, end); quicksort (array, start, pivot-1); quicksort (array, pivot+1, end); } |
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 | int partition { int i = a; for (int j = a; j <= b; j++) // просматриваем с a по b { if (m[j].CompareTo( m[b]) <= 0) // если элемент m[j] не превосходит m[b], { T t = m[i]; // меняем местами m[j] и m[a], m[a+1], m[a+2] и так далее... m[i] = m[j]; // то есть переносим элементы меньшие m[b] в начало, m[j] = t; // а затем и сам m[b] «сверху» i++; // таким образом последний обмен: m[b] и m[i], после чего i++ } } return i - 1; // в индексе i хранится <новая позиция элемента m[b]> + 1 } void quicksort { // для первого вызова: a = 0, b = <элементов в массиве> - 1 if (a >= b) return; int c = partition( m, a, b); quicksort( m, a, c - 1); quicksort( m, c + 1, b); } //Пример вызова //double[] arr = {9,1.5,34.4,234,1,56.5}; //quicksort // |
«С» с использованием лямбда-выражений
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 | using System; using System.Collections.Generic; using System.Linq; static public class Qsort { public static IEnumerable { if (!list.Any()) { return Enumerable.Empty } var pivot = list.First(); var smaller = list.Skip(1).Where(item => item.CompareTo(pivot) <= 0).QuickSort(); var larger = list.Skip(1).Where(item => item.CompareTo(pivot) > 0).QuickSort(); return smaller.Concat(new[] { pivot }).Concat(larger); } //(тоже самое, но записанное в одну строку, без объявления переменных) public static IEnumerable { return !list.Any() ? Enumerable.Empty item => item.CompareTo(list.First()) <= 0).shortQuickSort().Concat(new[] { list.First() }) .Concat(list.Skip(1).Where(item => item.CompareTo(list.First()) > 0).shortQuickSort()); } } |