Содержательная постановка задачи

advertisement
Министерство образования и науки Российской Федерации
Санкт-Петербургский государственный электротехнический университет
”ЛЭТИ”
Кафедра МОЭВМ
Отчет по лабораторной работе №1
По дисциплине: «Построение и анализ алгоритмов»
Преподаватель :Романенко Д.А.
Студент :ФКТИ гр.1303
Кутуева И.А.
Санкт-Петербург
2013
1. Содержательная постановка задачи
Сортировка усовершенствованным методом:
Быстрая сортировка (отсечение малых подмассивов: экспериментальный выбор
параметра)
2. Анализ задачи
В данной задаче рассматривается быстрая сортировка. Мы берем массив (из файла или
случайные числа), передаем этот массив в Sort и qsort.Выбираем в массиве некоторый
элемент, который называется опорным. Для повышения эффективности сортировки
выбирается середина массива. Далее проводится разделение массива: сравниваются
все элементы массива с опорным элементом и меняем местами таким образом, чтобы
все элементы со значением меньшим и равным опорному элементу, оказались слева от
него, а превышающие по значению опорный – справа от него. В итоге у нас получается
отсортированный массив «меньше-равные-большие».
3. Спецификация программы
При запуске программы выводится сообщение на экран:
«Откуда брать данные?
1. Из файла
2. Сгенерировать случайные данные»
Если мы выбираем из файла и файл пустой, то на экране выводится изначальный
массив и отсортированный – т.е. пустой.
Если после вывода сообщения на экран мы вводим число отличное от 1 и 2, или буквы,
то программа просит выбрать еще раз наш выбор.
4. Текст программы
#include <iostream>
#include <conio.h>
#include <fstream>
#include <time.h>
#include <random>
#include <string>
#include <algorithm>
using namespace std;
int *arr_1, *arr_2;
int len;
void Sort(int low, int high) {
int i=low;
int j=high;
int x=arr_1[(low+high)/2];
do {
while(arr_1[i]<x) ++i; //поиск элемента для переноса в старшую часть
while(arr_1[j]>x) --j; //поиск элемента для переноса в младшую часть
if(i<=j) {
// обмен элементов местами
int temp=arr_1[i];
arr_1[i]=arr_1[j];
arr_1[j]=temp; //переход к следующим элементам
i++; j--;
}
} while(i < j);
if(low < j) Sort(low, j);
if(i < high) Sort(i, high);
}
/*Требуется для qsort сортировки*/
int compare(const void *i, const void *j) {
return *(int *)i - *(int *)j;
}
void InFile() {
ifstream file("in.txt");
if(!file.good()) {
cout << "Невозможно открыть файл!";
getch();
exit(0);
}
len=0;
while(!file.eof()) {
int temp;
if(file >> temp) len++;
}
file.close();
arr_1=new int[len];
arr_2=new int[len];
file.open("in.txt");
for(int i=0; i<len; i++) {
file >> arr_1[i];
arr_2[i]=arr_1[i];
}
file.close();
}
void InRand() {
srand(time(0));
len=10;
arr_1=new int[len];
arr_2=new int[len];
for(int i=0; i<len; i++) {
arr_1[i]=rand()%10000-5000;
arr_2[i]=arr_1[i];
}
}
int main() {
setlocale(0, "");
string temp;
cout << "Откуда брать данные?\n";
cout << "1. Из файла\n";
cout << "2. Сгенерировать случайные данные\n";
while(true) {
cout << "Введите номер: ";
getline(cin, temp);
if(temp=="1" || temp=="2") break;
}
if(temp=="1") InFile();
else if(temp=="2") InRand();
//cout << "\nИсходный массив:\n";
//for(int i=0; i<len; i++) cout << arr_1[i] << " ";
time_t start, end;
start=clock();
Sort(0, len-1);
end=clock();
//cout << "\n\nОтсортированный массив:\n";
//for(int i=0; i<len; i++) cout << arr_1[i] << " ";
cout << "\n\nВремя моей сортировки " << len << " элементов: " << double(endstart)/1000;
start=clock();
qsort(arr_2, len, sizeof(int), compare);
end=clock();
cout << "\n\nВремя qsort сортировки " << len << " элементов: " << double(endstart)/1000;
getch();
return 0;
}
5. Примеры работы программы
Из файла:
Сгенерировать случайные данные:
Когда мы выбираем сгенерировать случайные данные целесообразно не выводить на
экран исходный и отсортированный массив.
Сравнение времени работы Sort и qsort:
20.000
15.000
10.000
sort
qsort
5.000
0.000
-5.000
Вопросы к отчету:
Почему в qsort написано именно так return
*(int *)i - *(int *)j;
Const void*i, const void*j- в функцию передаем пустые указатели
Потом преобразуем указатели на тип int - (int*)i
Потом вытаскиваем значение из памяти, на которое указывает указатели - *(int*)i
В итоге возвращаем разность значений.
Каким условиям должно удовлетворять на множестве элементов из
которых состоит сортировочный массив?
Мы передаем пустые указатели, чтобы можно было сравнивать любые типы. Поэтому
особых условий для массива нет.
Download