Скачать презентацию Сортировка реализация Алтайский государственный университет Математический факультет Кафедра Скачать презентацию Сортировка реализация Алтайский государственный университет Математический факультет Кафедра

19_SortingCode.ppt

  • Количество слайдов: 14

Сортировка: реализация Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2014 Сортировка: реализация Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2014

2 План Лекция 19 n План ¨ Сортировка: от примитивной программы к универсальной схеме 2 План Лекция 19 n План ¨ Сортировка: от примитивной программы к универсальной схеме n n Процедура сортировки массива Гибкость по отношению к критерию сортировки Гибкость по отношению к базовому типу Примеры

Сортировка: от примитивной программы к универсальной схеме n n Процедура сортировки массива Гибкость по Сортировка: от примитивной программы к универсальной схеме n n Процедура сортировки массива Гибкость по отношению к критерию сортировки Гибкость по отношению к базовому типу Примеры

Сортировка обменами Пузырьковая сортировка void main() { const int N = 10; int A[N], Сортировка обменами Пузырьковая сортировка void main() { const int N = 10; int A[N], i, j, c; // заполнить массив // вывести исходный массив for (i=0; i= i; j--) if ( A[j] > A[j+1] ) { с = A[j]; A[j] = A[j+1]; A[j+1] = с; } } // вывести итоговый массив } 4

5 Сортировка обменами Как отсортировать 2, 3, … массива? void main() { const int 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= i; j--) if ( A[j] > A[j+1] ) { с = A[j]; A[j] = A[j+1]; A[j+1] = с; } } // ? ? ? ? ? // вывести массивы A, B } Как запрограммировать сортировку массивов A и B?

6 Сортировка обменами Как отсортировать 2, 3, … массива? void main() { const int 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= i; j--) if ( A[j] > A[j+1] ) { с = A[j]; A[j] = A[j+1]; A[j+1] = с; } } // сортировать B for (i=0; i<2*N-1; i++){ for (j=2*N-2; j>=i; j--) if ( B[j] > B[j+1] ) { с = B[j]; B[j] = B[j+1]; B[j+1] = с; } } // вывести массивы A, B } Как запрограммировать сортировку массивов A и B? Простое решение: сдублировать фрагмент кода, сортирующего A

7 Сортировка обменами Как отсортировать 2, 3, … массива? // процедура сортировки массива // 7 Сортировка обменами Как отсортировать 2, 3, … массива? // процедура сортировки массива // по возрастанию void bubble_sort(int *a, int n) { int i, j, c; for (i=0; i= i; j--) if ( a[j] > a[j+1] ) { с = a[j]; a[j] = a[j+1]; a[j+1] = с; } } void main() { const int N = 10; int A[N], int B[2*N]; // заполнить массивы A, B // вывести массивы A, B // сортировать A, B bubble_sort(A, N); bubble_sort(B, 2*N); // вывести массивы A, B } Хорошее решение: описать процедуру сортировки и вызвать ее для A и B

8 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сортировки массива // по 8 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сортировки массива // по возрастанию void bubble_sort(int *a, int n) { int i, j, c; for (i=0; i= i; j--) if ( a[j] > a[j+1] ) { с = a[j]; a[j] = a[j+1]; a[j+1] = с; } } void main() { const int N = 10; int A[N], int B[2*N]; // заполнить массивы A, B // вывести массивы A, B // сортировать A, B bubble_sort(A, N); bubble_sort(B, 2*N); // вывести массивы A, B } Как устранить зависимость от критерия сортировки? Хорошее решение: сделать критерий сортировки одним из параметров процедуры сортировки

9 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сравнения «x > y» 9 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сравнения «x > y» int is_greater(int x, int y){ return x>y; } // процедура сравнения «x < y» int is_less(int x, int y){ return x=i; j--) if ( cmp(a[j], a[j+1]) ) { с = a[j]; a[j] = a[j+1]; a[j+1] = с; } } } void main() { const int N = 10; int A[N], int B[2*N]; // заполнить массивы A, B // вывести массивы A, B // сортировать A по возрастанию bubble_sort(A, N, is_greater); // сортировать B по убыванию bubble_sort(B, 2*N, is_less); // вывести массивы A, B } Разные критерии сортировки Единая процедура сортировки, инвариантная к критерию

10 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сравнения «x > y» 10 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура сравнения «x > y» int is_greater(int x, int y){ return x>y; } // процедура сравнения «x < y» int is_less(int x, int y){ return x=i; j--) if ( cmp(a[j], a[j+1]) ) { с = a[j]; a[j] = a[j+1]; a[j+1] = с; } } } void main() { const int N = 10; int A[N], int B[2*N]; // заполнить массивы A, B // вывести массивы A, B // сортировать A по возрастанию bubble_sort(A, N, is_greater); // сортировать B по убыванию bubble_sort(B, 2*N, is_less); // вывести массивы A, B } Как устранить зависимость от базового типа? Решение: 1. Сделать универсальным сравнение 2. Сделать универсальной перестановку

11 Сортировка обменами Как сделать гибкой процедуру сортировки? Процедура сравнения «знает» какого // процедура 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=i; j--) if ( cmp(&a[j], &a[j+1]) ) swap(&a[j], &a[j+1], size); } void main() { const int N = 10; int A[N], float B[2*N]; // заполнить массивы A, B // вывести массивы A, B // сортировать A по убыванию bubble_sort(A, N, sizeof(int), is_less_i); // сортировать B по возрастанию Для перестановки надо bubble_sort(B, 2*N, sizeof(float), is_more_f); знать адреса элементов и // вывести массивы A, B их размер }

12 Сортировка обменами Как сделать гибкой процедуру сортировки? // процедура перестановки void swap(const void 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 n нужный критерий сортировки размер элементов массива Примером реализации «гибкой» схемы являются стандартные функции qsort, bsearch, lsearch 13

Вопросы и ответы Вопросы? n Сортировка: от примитивной программы к универсальной схеме Процедура сортировки Вопросы и ответы Вопросы? n Сортировка: от примитивной программы к универсальной схеме Процедура сортировки массива ¨ Гибкость по отношению к критерию сортировки ¨ Гибкость по отношению к базовому типу ¨ Примеры ¨ 14