19_SortingCode.ppt
- Количество слайдов: 14
Сортировка: реализация Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2014
2 План Лекция 19 n План ¨ Сортировка: от примитивной программы к универсальной схеме n n Процедура сортировки массива Гибкость по отношению к критерию сортировки Гибкость по отношению к базовому типу Примеры
Сортировка: от примитивной программы к универсальной схеме n n Процедура сортировки массива Гибкость по отношению к критерию сортировки Гибкость по отношению к базовому типу Примеры
Сортировка обменами Пузырьковая сортировка void main() { const int N = 10; int A[N], i, j, c; // заполнить массив // вывести исходный массив for (i=0; i
5 Сортировка обменами Как отсортировать 2, 3, … массива? void main() { const int N = 10; int A[N], int B[2*N], i, j, c; // заполнить массивы A, B // вывести массивы A, B for (i=0; i
6 Сортировка обменами Как отсортировать 2, 3, … массива? void main() { const int N = 10; int A[N], int B[2*N], i, j, c; // заполнить массивы A, B // вывести массивы A, B // сортировать A for (i=0; i
7 Сортировка обменами Как отсортировать 2, 3, … массива? // процедура сортировки массива // по возрастанию void bubble_sort(int *a, int n) { int i, j, c; for (i=0; i
8 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сортировки массива // по возрастанию void bubble_sort(int *a, int n) { int i, j, c; for (i=0; i
9 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сравнения «x > y» int is_greater(int x, int y){ return x>y; } // процедура сравнения «x < y» int is_less(int x, int y){ return x
10 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сравнения «x > y» int is_greater(int x, int y){ return x>y; } // процедура сравнения «x < y» int is_less(int x, int y){ return x
11 Сортировка обменами Как сделать гибкой процедуру сортировки? Процедура сравнения «знает» какого // процедура перестановки типа void swap(const void и умеет их элементы *x, const void *y, сравнивать, получив int sz) { адреса char t[MAXSIZE]; memcpy(t, x, sz); memcpy(x, y, sz); memcpy(y, t, sz); } // процедура сравнения «x < y» int is_less_i(const void *x, const void *y) { return *(int*)x < *(int*) y; } // процедура сравнения «x < y» int string. h memcpy() из is_more_f(const void *x, const void *y) { копирует область памяти return *(float*)x > *(float*) y; указанного размера } // процедура сортировки массива void bubble_sort(void *a, int n, int size, При вызове процедуры int (*cmp)(const void *x, сортировки надо указать { const void *y)) int i, j, c; базового типа и размер for (i=0; i
12 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура перестановки void swap(const void *x, Процедура сравнения элементов const void *y, типа «Точка» int sz) {. . . } // процедура сортировки массива void bubble_sort(void *a, int n, int size, int (*cmp)(const void *x, const void *y)) Пользовательский тип «Точка» {. . . } typedef struct point_t { float x, y; } Point; Сортировка массива точек по убыванию абсцисс // процедура сравнения a. x < b. x int cmp_by_x(const void *a, const void *b) { Сортировка массива точек по return ((Point*)a)->x < ((Point*)b)->x; возрастанию ординат } // процедура сравнения a. x < b. x int cmp_by_y(const void *a, const void *b) { return ((Point*)a)->y > ((Point*)b)->y; } void main() { const int N = 10; Point A[N]; // заполнить массив A // вывести массивы A // сортировать A по убыванию x bubble_sort(A, N, sizeof(Point), cmp_by_x); // сортировать A по возрастанию y // вывести массив A bubble_sort(A, N, sizeof(Point), cmp_by_y); // вывести массив A }
Сортировка: общие замечания «Гибкая» схема сортировки n Обеспечивается гибкость по отношению к критерию сортировки ¨ к типу сортируемых данных ¨ n Пользователю процедуры сортировки необходимо определять процедуры сравнения элементов нужных типов ¨ при вызове процедуры сортировки явно указывать ¨ n n n нужный критерий сортировки размер элементов массива Примером реализации «гибкой» схемы являются стандартные функции qsort, bsearch, lsearch 13
Вопросы и ответы Вопросы? n Сортировка: от примитивной программы к универсальной схеме Процедура сортировки массива ¨ Гибкость по отношению к критерию сортировки ¨ Гибкость по отношению к базовому типу ¨ Примеры ¨ 14