Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рацеев С.М. Программирование на языке Си.pdf
Скачиваний:
369
Добавлен:
23.03.2016
Размер:
1.65 Mб
Скачать

free(a); return 3;

}

/* записываем индексы элементов массива a, обладающих свойством Q */

for(i = j = 0; i < n; i++) if(Q(a[i]))

ind[j++] = i;

/* сортируем элементы массив a, обладающие свойством Q, через массив индексов ind */

r = m; do

{

flag = 0;

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

if (a[ind[i-1]].year > a[ind[i]].year)

{

buf = a[ind[i]]; a[ind[i]] = a[ind[i-1]]; a[ind[i-1]] = buf; flag = 1;

}

r--; }while(flag);

/* устанавливаем файловый указатель в начало файла */ rewind(f);

/* записываем отсортированный массив в файл */ fwrite(a, sizeof(struct WORKER), n, f);

free(a);

free(ind);

fclose(f); return 0;

}

4. Сортировка с условием линейного списка на базе пузырьковой сортировки

#include<stdio.h>

#include<stdlib.h>

335

typedef struct ELEMENT

{

int data;

struct ELEMENT *next; } ELEMENT;

/* подсчет количества элементов, обладающих свойством Q*/ int Count(ELEMENT *head)

{

int count = 0; ELEMENT *q;

for(q = head->next; q != NULL; q = q->next) if (Q(q->data))

count++; return count;

}

/* сортировка списка с условием на базе пузырькового метода */ void SortList(ELEMENT *head)

{

ELEMENT *q, **ind; long m, i, r;

int flag, buf;

m = Count(head);

ind = (ELEMENT **)malloc(m * sizeof(ELEMENT *)); for(i = 0, q = head->next; q != NULL; q = q->next)

if (Q(q->data)) ind[i++] = q;

r = m; do

{

flag = 0;

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

if (ind[i-1]->data > ind[i]->data)

{

buf = ind[i]->data; ind[i]->data = ind[i-1]->data;

336

ind[i-1]->data = buf; flag = 1;

}

r--; }while(flag); free(ind);

}

int main( )

{

ELEMENT *head;

…/* создание списка */ SortList(head);

return 0;

}

5. Сортировка с условием линейного списка на базе быстрой сортировки

/* подсчет количества элементов, обладающих свойством Q*/ int Count(ELEMENT *head)

{

int count = 0; ELEMENT *q;

for(q = head->next; q != NULL; q = q->next) if (Q(q->data))

count++; return count;

}

/* быстрая сортировка списка через массив ind */ void QuickSort (ELEMENT **ind, int left, int right)

{

int i, j, x, buf; i = left;

j = right;

337

x = ind[(left + right)/2]->data; do

{

while (ind[i]->data < x) i++;

while (x < ind[j]->data) j--;

if (i <= j)

{

buf = ind[i]->data; ind[i]->data = ind[j]->data; ind[j]->data = buf;

i++; j--;

}

} while( i <= j);

if (left < j) QuickSort (ind, left, j); if (right > i) QuickSort (ind, i, right);

}

int main()

{

ELEMENT *head, *q, **ind; int i, m;

…/* создание списка */ m = Count(head);

ind = (ELEMENT **)malloc(m * sizeof(ELEMENT *)); for(i = 0, q = head->next; q != NULL; q = q->next)

if (Q(q->data)) ind[i++] = q;

QuickSort(ind, 0, m - 1); free(ind);

return 0;

}

338