Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

1 Задача

// максимальный размер стека

#define MAXSTACK 2048

template<class T>

void qSortI(T a[], long size)

{

// указатели, участвующие в разделении

long i, j;

// границы сортируемого в цикле фрагмента

long lb, ub;

// стек запросов

long lbstack[MAXSTACK], ubstack[MAXSTACK];

// каждый запрос задается парой значений,

// а именно: левой(lbstack) и правой(ubstack)

// границами промежутка

// текущая позиция стека

long stackpos = 1;

// середина массива

long ppos;

// опорный элемент

T pivot;

T temp;

lbstack[1] = 0;

ubstack[1] = size-1;

do {

// Взять границы lb и ub текущего массива из стека.

lb = lbstack[ stackpos ];

ub = ubstack[ stackpos ];

stackpos--;

do {

// Шаг 1. Разделение по элементу pivot

ppos = ( lb + ub ) >> 1;

i = lb; j = ub; pivot = a[ppos];

do {

while ( a[i] < pivot ) i++;

while ( pivot < a[j] ) j--;

if ( i <= j ) {

temp = a[i]; a[i] = a[j]; a[j] = temp;

i++; j--;

}

} while ( i <= j );

// Сейчас указатель i указывает на начало правого подмассива,

// j - на конец левого (см. иллюстрацию выше), lb ? j ? i ? ub.

// Возможен случай, когда указатель i или j выходит за границу массива

// Шаги 2, 3. Отправляем большую часть в стек и двигаем lb,ub

// правая часть больше

if ( i < ppos )

{

// если в ней больше 1 элемента - нужно

if ( i < ub )

{

// сортировать, запрос в стек

stackpos++;

lbstack[ stackpos ] = i;

ubstack[ stackpos ] = ub;

}

// следующая итерация разделения будет работать с левой частью

ub = j;

// левая часть больше

} else {

if ( j > lb ) {

stackpos++;

lbstack[ stackpos ] = lb;

ubstack[ stackpos ] = j;

}

lb = i;

}

// пока в меньшей части более 1 элемента

} while ( lb < ub );

// пока есть запросы в стеке

} while ( stackpos != 0 );

}

Лабораторная работа №30

Сортировка на деревьях

Цель: закрепление на практике работы с одним из методов сортировки на деревьях.

Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания.

Самостоятельная работа не предусмотрена.

Необходимый уровень знаний:

  • работа с указателями;

  • работа с функциями.

1 Задача

#include <iostream.h>

class Item

{

int value;

public:

void setValue(int value)

{

this->value = value;

}

int getValue()

{

return this->value;

}

};

template <class Item>

// функция пирамидальной сортировки

void heapsort(Item a[], int l, int r)

{

int k, N = r -l + 1;

Item *pq = a + 1 -1;

for (k = N/2; k >= 1; k--)

fixDown(pq, k, N);

while (N > 1)

{

exch(pq[1], pq[N]);

fixDown(pq, 1, --N);

}

}

// функция обмена

void exch(Item first, Item second)

{

Item temp = second;

second = first;

first = temp;

}

template <class Item>

void fixDown(Item a[], int k, int N)

{

while (2*k <= N)

{

int j = 2*k;

if (j < N && a[j].getValue() < a[j + 1].getValue())

j++;

if (!(a[k].getValue() < a[j].getValue()))

break;

exch(a[k], a[j]);

k = j;

}

}

void main()

{

int k,N, length;

cout<<"Please input heapsort array length"<<endl;

cin>>length;

Item* arrayParameters = new Item[length];

int temp;

for (int i =0; i < length; i++)

{

cout<<"Please input array element number "<<i<<endl;

cin>>temp;

arrayParameters[i].setValue(temp);

}

cout<<"Please input k parameter"<<endl;

cin>>k;

cout<<"Please input N parameter"<<endl;

cin>>N;

heapsort(arrayParameters,k,N);

cout<<"After heapsort:"<<endl;

for (int m =0; m < length; m++)

{

cout<<"Array element number "<<m<<endl;

cout<<arrayParameters[m].getValue()<<endl;

}

}

Задачники

Вводное занятие

Все входные и выходные данные в заданиях этой группы являются целыми числами. Все числа, для которых указано количество цифр (двузначное число, трехзначное число и т. д.), считаются положительными.

  1. Дано расстояние L в сантиметрах. Используя операцию деления нацело, найти количество полных метров.

  2. Дана масса M в килограммах. Используя операцию деления нацело, найти количество полных тонн.

  3. Дан размер файла в байтах. Используя операцию деления нацело, найти количество полных килобайтов, которые занимает данный файл (1 килобайт = 1024 байта).

  4. Даны целые положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Используя операцию деления нацело:

  1. найти количество отрезков B, размещенных на отрезке A.

  2. найти длину незанятой части отрезка A.

  1. С начала суток прошло N секунд (N — целое). Найти:

  1. количество полных минут, прошедших с начала суток;

  2. количество целых часов, прошедших с начала суток;

  3. количество секунд, прошедших с начала последней минуты;

  4. количество секунд, прошедших с начала последнего часа;

  5. количество полных минут, прошедших с начала последнего часа.

  1. Дано двузначное число:

  1. вывести вначале его левую цифру (десятки), а затем — его правую цифру (единицы). Для нахождения десятков использовать операцию деления нацело, для нахождения единиц — операцию взятия остатка от деления;

  2. найти сумму и произведение его цифр;

  1. вывести число, полученное при перестановке цифр исходного числа.

  1. Дано трехзначное число:

    1. вывести разряд сотен данного числа;

    2. вывести на одной строке последнюю цифру (разряд единиц), а на другой — среднюю цифру (десятки);

    3. найти сумму и произведение цифр заданного числа;

    4. вывести число, полученное при прочтении исходного числа справа налево;

    5. в числе зачеркнули первую цифру слева и приписали ее справа. Вывести полученное число;

    6. в числе зачеркнули первую цифру справа и приписали ее слева. Вывести полученное число;

    7. вывести число, полученное при перестановке разрядов сотен и десятков исходного числа (например, 123 перейдет в 213);

    8. вывести число, полученное при перестановке разрядов десятков и единиц исходного числа (например, 123 перейдет в 132).

  1. Дано целое число. Если оно является положительным, то прибавить к нему 1; если отрицательным, то вычесть из него 2; если нулевым, то заменить его на 10. Вывести полученное число.

  2. Даны nцелых чисел, одно из которых отлично от других, равных между собой. Определить порядковый номер числа, отличного от остальных.

  3. Даны три целых числа:

  1. найти количество положительных чисел в исходном наборе;

  2. найти количество положительных и количество отрицательных чисел в исходном наборе;

  3. вывести большее число из трех заданных;

  4. вывести порядковый номер меньшего числа из трех заданных;

  5. вывести вначале большее число, а затем меньшее число из трех заданных;

  6. найти их среднее арифметическое;

  7. найти сумму двух наибольших из трех чисел.

Целые числа

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]