Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2009, 07:42   #1
ai\ekcah^p
Форумчанин
 
Аватар для ai\ekcah^p
 
Регистрация: 03.05.2009
Сообщений: 112
По умолчанию Методы сортировки с квадратичной трудоемкостью

Порядок выполнения работы:
1. Разработать процедуры сортировки массива целых чисел методом прямого выбора, методом пузырьковой сортировки и методом шейкерной сортировки (язык программирования Си++).
2. Правильность сортировки проверить путем подсчета контрольной суммы и числа серий в массиве.
3. Во время сортировки предусмотреть подсчет количества пересылок и сравнений (М и С), сравнить их с теоретическими оценками.
4. Составить таблицу следующего вида (данные получить экспериментально) для n= 100, 200, 300, 400, 500. (n – количество элементов в массиве)
5. Проанализировать полученные результаты. (Какой из методов самый быстрый? Самый медленный? Как сложность зависит от начальной отсортированности?)

Помогите пожалуйста разобраться!
Программа есть , запускается, ввожу данные n, результат не показывает ->


Код:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

//максимальная длина массива
const int maxn=500;

int ar[maxn],br[maxn],cr[maxn],dr[maxn];
int kolc,kolm;

//метод прямого выбора
int prv(int size,int* arr)
{
    int i,k,b;
    int m,c;
    int min;
    //количество пересылок и сравнений
    m=0; c=0;
    //проходимся по массиву с 0 до сайз-2
    for (i=0; i<size-1; i++)
    {
        min=i;
        //проходимся с и до конца массива и ищем минимальный
        for (k=i+1; k<size; k++)
        {
            c++;
            if (arr[k]<arr[min]) min=k;
        }
        if (min!=i)
        {
            b=arr[i]; arr[i]=arr[min]; arr[min]=b;
            m++;
        }
    }
    //запоминаем количество пересылок и сравнений
    kolc=c; kolm=m;
    return 0;
}

//метод пузырька
int puz(int size,int* arr)
{
    int i,k,b,c,m;
    //количество пересылок и сравнений
    c=0; m=0;
    //проходимся по всему массиву сайз-1 раз
    for (i=1; i<size; i++)
    {
        //с конца до текущего элемента
        for (k=size-1; k>=i; k--)
        {
            c++;
            if (arr[k-1]>arr[k]) 
            {
                b=arr[k-1]; arr[k-1]=arr[k]; arr[k]=b; m++;
            }
        }
    }
    //запоминаем количество пересылок и сравнений
    kolc=c; kolm=m;
    return 0;
}
//метод Щейкера
int sheiker(int size,int* arr)
{
    int i,k,b,m,c;
    m=0; c=0;
    int l=1;
    int r=size-1; k=size-1;
    do
    {
        for (i=r; i>=l; i--)
        {
            c++;
            if (arr[i-1]>arr[i])
            { 
                b=arr[i-1]; arr[i-1]=arr[i]; arr[i]=b; k=i; m++;
            }
        }
        l++;
        for (i=l; i<=r; i++)
        {
            c++;
            if (arr[i-1]>arr[i]) 
            {
                b=arr[i-1]; arr[i-1]=arr[i]; arr[i]=b; k=i; m++;
            }
        }
        r=k-1;
    }
    while (r>=l);
    kolm=m; kolc=c;
    return 0;
}
//считаем контрольную сумму
int consum(int size, int* arr)
{
    int sum=0;
    //считаем сумму всех чисел массива
    for (int i=0; i<size; i++) sum+=arr[i];
    //возращаем данное значение
    return sum;
}
//считаем количество серий
int kolser(int size,int* arr)
{
    int kol=1;
    for (int i=1; i<size; i++) 
        if (arr[i]!=arr[i-1]) kol++;
    return kol;
}

int main()
{
    int n;
    //делаем ввод данных
    printf("Enter n ",&n);
    scanf("%i",&n);
    //все числа случайные
    for (int i=0; i<n; i++) ar[i]=rand()%1000000;
    //сортируем массив разними методами
    //при этом происходит проверка контрольных сумм
    memcpy(br,ar,sizeof(ar)); memcpy(cr,ar,sizeof(ar)); memcpy(dr,ar,sizeof(ar));
    //сортируем и выводим количество пересылок и сравнений
    prv(n,br); printf("m=%i c=%i\n",kolm,kolc);
    puz(n,cr); printf("m=%i c=%i\n",kolm,kolc);
    sheiker(n,dr); printf("m=%i c=%i\n",kolm,kolc);
    //делаем проверку по контрольным суммам
    if (consum(n,ar)==consum(n,br) && consum(n,ar)==consum(n,cr) && consum(n,ar)==consum(n,dr)) printf("Kontrolnie summi sovpadaut\n");
    else printf("Kontrolnie summi ne sovpadaut\n");
    //делаем подсчет количества серий в отсортированных массивах и сравниваем их
    if (kolser(n,br)==kolser(n,cr) && kolser(n,br)==kolser(n,dr)) printf("Kol-vo seriy sovpadaet\n");
    else printf("Kol-vo seriy ne sovpadaet\n");
    return 0;

}

Последний раз редактировалось ai\ekcah^p; 06.09.2009 в 07:45.
ai\ekcah^p вне форума Ответить с цитированием
Старый 06.09.2009, 13:34   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ai\ekcah^p
Программа есть , запускается, ввожу данные n, результат не показывает ->
У меня работает.


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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.09.2009, 14:41   #3
ai\ekcah^p
Форумчанин
 
Аватар для ai\ekcah^p
 
Регистрация: 03.05.2009
Сообщений: 112
По умолчанию

Я тоже в Dev-C++ компилировал. Почему-то не хочет работать, тока n ввожу и все.
ai\ekcah^p вне форума Ответить с цитированием
Старый 06.09.2009, 14:53   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А что значит "и все"? Если вы имеете в виду, что программа закрывается сразу после ввода n, то запускайте из консоли или добавьте в конец:
Код:
fflush(stdin);
getchar();
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.07.2010, 21:53   #5
maxgalll
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
У меня работает.


Покажите свой скрин. Или скомпилированную программу.
подскажи почему при вводе н=300 он выводит отрицательные значения......???
Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Методы-в класс xMoNaHx Паскаль, Turbo Pascal, PascalABC.NET 16 23.06.2009 18:17
Значение квадратичной функции MAKEDON Общие вопросы C/C++ 3 07.03.2009 13:33
Методы сортировки. Teddy Помощь студентам 1 16.10.2008 19:08
Методы... Arkuz Свободное общение 6 11.10.2008 16:53
Методы шифрования D@rk M@k Свободное общение 3 27.02.2008 13:56