Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_1-23.docx
Скачиваний:
17
Добавлен:
11.05.2015
Размер:
106.18 Кб
Скачать

1. Внутренняя сортировка данных методом подсчета. Эффективность данного алгоритма. Привести фрагмент программы, поясняющий данный алгоритм.

Сортировка подсчётом — алгоритм сортировки массива, при котором подсчитывается число одинаковых элементов. Алгоритм выгодно применять, когда в массиве много элементов, но все они достаточно малы.

Идея сортировки указана в названии — нужно подсчитывать число элементов, а затем выстраивать массив. Пусть, к примеру, имеется массив A из миллиона натуральных чисел, меньших 100. Тогда можно создать вспомогательный массив B из 99 (1..99) элементов, «пробежать» весь исходный массив и вычислять частоту встречаемости каждого элемента — то есть если A[i]=a, то B[a] следует увеличить на единицу. Затем «пробежать» счетчиком i массив B, записывая в массив A число i B[i] раз.

void CountingSort (int *a, int n, int min, int max)

{

int i, j, c, *b;

for (i = 0; i for (j = min; j 0)

{

*a = j;

++a;

--c;

}

}

}

2. Внутренняя сортировка данных методом выбора. Эффективность данного алгоритма. Привести фрагмент программы, поясняющий данный алгоритм.

Идея метода состоит в том, чтобы создавать отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке. Если входная последовательность почти упорядочена, то сравнений будет столько же, значит алгоритм ведет себя неестественно.

Наихудший случай:

Число сравнений в теле цикла: (N-1)*N/2.

Число сравнений в заголовках циклов: (N-1)*N/2.

Число сравнений перед операцией обмена: N-1.

Суммарное число сравнений: N2-1.

Число обменов: N-1.

void selectSort(int* arr, int size)

{

int tmp, i, j, pos;

for(i = 0; i < size; ++i) // i - номер текущего шага

{

pos = i;

tmp = arr[i];

for(j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента

{

if (arr[j] < tmp)

{

pos = j;

tmp = arr[j];

}

}

arr[pos] = arr[i];

arr[i] = tmp; // меняем местами наименьший с a[i]

}

}

3. Внутренняя сортировка данных методом простых вставок. Эффективность данного алгоритма. Привести фрагмент программы, поясняющий данный алгоритм.

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

эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим;

эффективен на наборах данных, которые уже частично отсортированы;

это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы);

может сортировать список по мере его получения;

void insertSort(array_type a[], int length)

{

int i, j;

for (i = 1; i < length; i++) { value = a[i]; for (j = i-1; (j >= 0) && (a[j] > value); j--) {

a[j+1] = a[j];

}

a[j+1] = value;

}

}

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