Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка массива через функцию, методом вставки 
V
    Опции темы
Metalex
Дата 17.12.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Отсортировать динамический массив методом вставки передачей в функию. Функция должна вернуть время, затраченное на сортировку.
Мой код:
Код
#include <iostream.h>
#include <stdio.h>

//сортировка методом вставки
int Mvstavki (int *matrix, int n)
{
    clock_t time;
    time = clock();
    
    int x, i, j;
    for(i=0;i<n;i++)
    {
        x=matrix[i];
        j=i;
        while(x<matrix[j-1]&&j!=0)
        {
                matrix[j]=matrix[j-1]; 
                j--;
        }
        matrix[j]=x;
    }
    time = clock() - time;
return (time);
}

int main()
{
    int n, i, j;
    cout <<"Vvedite n"<<endl;
    cin >>n;
    int *matrix;
    matrix=new int [n];
    
    srand(time(NULL));
    for (i=0; i<n; i++)
    matrix[i]=rand()%100-50;
    
    cout<<"Nachal'nui massiv:"<<endl;
    for (i=0; i<n; i++)
    cout<<matrix[i]<<" ";
    cout<<endl;

    cout<<"Vremya vupolnenya"<<endl;
    printf("%s", "Time1 = \0");
    printf("%f", (double)Mvstavki(matrix, n)/CLK_TCK);
    printf("%s", " - sortirovka metodom vstavki\0");
    printf("\n");
    
    cout<<"Otsortirovanyi massiv:"<<endl;
    for (i=0; i<n; i++)
    cout<<matrix[i]<<" ";
    cout<<endl;   
    
    delete [] matrix;
    matrix=0;
    
system ("Pause");
return 0;
}

Но время равно 0.000000. Почему? И можно ли как-то printf слить в одну строку? Я пытался, но тогда даже эти нули не выводятся. Спасибо.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
azesmcar
Дата 17.12.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



потому что сортирует быстро, попробуй большой обьем данных.

Дополняй, изменяй..
Код

#include <iostream>
#include <ctime>
#include <cstdlib>

unsigned int sort(int * a, unsigned int size)
{
    time_t now = time(0);
    for (unsigned int j = 2; j < size; ++j)
    {
        for (unsigned int k = 0; k < j; ++k)
        {
            if (a[j] < a[k])
            {
                int temp = a[k];
                a[k] = a[j];
                a[j] = temp;
            }
        }
    }
    return (unsigned int)(time(0) - now);
}

int main() {
    const int size = 30000;
    int* a = new int[size];
    for (int i = 0; i < size; ++i)
        a[i] = rand() % 1000;

    unsigned int duration = sort(a, size);

    /*for (unsigned int i = 0; i < size; ++i)
        std::cout << a[i] << std::endl;*/

    std::cout << "sort duration: " << duration << std::endl;

    delete [] a;
}

PM   Вверх
Metalex
Дата 17.12.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



azesmcar, спасибо огромное!
Еще вопросик: если мне нужно применить всего 3 метода сортировки (это был только первый) в одной программе (функциями) и сравнить значения длительности исполнения сортировок. Но уже при первой массив будет упорядочен. Нужно заранее копировать первоначальный массив еще 2 раза? И можно ли сделать так:
Код
massiv1=massiv2;

То есть присвоить одному массиву другой?

Добавлено через 14 секунд
Или через цикл?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
azesmcar
Дата 17.12.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



Цитата(Metalex @  17.12.2009,  16:20 Найти цитируемый пост)
Нужно заранее копировать первоначальный массив еще 2 раза? И можно ли сделать так:

нет, так нельзя (точнее можно, но так скопируется указатель).

Цитата(Metalex @  17.12.2009,  16:20 Найти цитируемый пост)
Или через цикл? 

 smile 
а также std::copy, memcpy ...
PM   Вверх
Metalex
Дата 17.12.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Цитата(azesmcar @  17.12.2009,  16:22 Найти цитируемый пост)
а также std::copy, memcpy ...

ну это мне не грозит smile все равно не понятно



--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Metalex
Дата 17.12.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



И еще одно: зачем
Код
unsigned int
?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Dancer
Дата 17.12.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 4
Всего: 37



Код

.....
   const int size = 30000;
    int* a = new int[size];
    for (int i = 0; i < size; ++i)
        a[i] = rand() % 1000;

    int * bArray = new int[size];
    int * cArray = new int[size];
    memcpy(bArray, a, size*sizeof(int));
    memcpy(cArray, a, size*sizeof(int));

   unsigned int duration = sort(a, size);
.....



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Metalex
Дата 17.12.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Гляньте че тут.. Теперь у меня 2 функции, но считает либо вторая либо первая.. Грубые ошибки есть?
Код
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

//сортировка методом вставки
int Sort1 (int *matrix, int n)
{
    clock_t time;
    time = clock();
    
    int x, i, j;
    for(i=0;i<n;i++)
    {
        x=matrix[i];
        j=i;
        while(x<matrix[j-1]&&j!=0)
        {
                matrix[j]=matrix[j-1]; 
                j--;
        }
        matrix[j]=x;
    }
    time = clock() - time;
return (time);
}

//сортировка методом простого выбора
int Sort2 (int *matrix, int n)
{
    clock_t time;
    time = clock();
    
    int x, k, i, j;
    for(i=0;i<n;i++)
    {
        k=i;
        x=matrix[i];
        for(j=i+1; j<n; j++)
        if (matrix[j]<x) 
        {
                k=j; 
                x=matrix[k];
        }
        matrix[k]=matrix[i];
        matrix[i]=x;
    }
    time = clock() - time;
return (time);
}

int main()
{
    int n, i, j;
    cout <<"Vvedite n"<<endl;
    cin >>n;
    int *matrix=new int [n];
    int *matrixx=new int [n];
    
    srand(time(NULL));
    for (i=0; i<n; i++)
    {
        matrix[i]=rand()%10000-5000;
    }
    
    memcpy(matrixx, matrix, n*sizeof(int));
    
    cout<<"Nachal'nui massiv:"<<endl;
    for (i=0; i<n; i++)
    cout<<matrix[i]<<" ";
    cout<<endl;

    cout<<"Vremya vupolnenya"<<endl;
    printf("%s", "Time1 = \0");
    printf("%f", (double)Sort1(matrix, n)/CLK_TCK);
    printf("%s", " - sortirovka metodom vstavki\0");
    printf("\n");
    
    cout<<"Vremya vupolnenya"<<endl;
    printf("%s", "Time2 = \0");
    printf("%f", (double)Sort2(matrixx, n)/CLK_TCK);
    printf("%s", " - sortirovka metodom vstavki\0");
    printf("\n");
    
    cout<<"Otsortirovanyi massiv:"<<endl;
    for (i=0; i<n; i++)
    cout<<matrix[i]<<" ";
    cout<<endl;   
    
    delete [] matrix;
    matrix=0;
    
system ("Pause");
return 0;
}



--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
azesmcar
Дата 18.12.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 9
Всего: 211



не пойму я чего-то..либо printf используй, либо cout.. апридилайса да © smile 

Цитата(Metalex @  17.12.2009,  18:41 Найти цитируемый пост)
Гляньте че тут.. Теперь у меня 2 функции, но считает либо вторая либо первая.. Грубые ошибки есть?

нормально должно работать, убери вывод массива и сгенерируй массив побольше..вот так
Код

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

//сортировка методом вставки
int Sort1 (int *matrix, int n)
{
    clock_t time;
    time = clock();

    int x, i, j;
    for(i=0;i<n;i++)
    {
        x=matrix[i];
        j=i;
        while(x<matrix[j-1]&&j!=0)
        {
            matrix[j]=matrix[j-1]; 
            j--;
        }
        matrix[j]=x;
    }
    return time = clock() - time;
}
//сортировка методом простого выбора
int Sort2 (int *matrix, int n)
{
    clock_t time;
    time = clock();

    int x, k, i, j;
    for(i=0;i<n;i++)
    {
        k=i;
        x=matrix[i];
        for(j=i+1; j<n; j++)
            if (matrix[j]<x) 
            {
                k=j; 
                x=matrix[k];
            }
            matrix[k]=matrix[i];
            matrix[i]=x;
    }
    return clock() - time;
}
int main()
{
    int n;
    cout <<"Vvedite n"<<endl;
    cin >>n;
    int *matrix=new int [n];
    int *matrixx=new int [n];

    srand((unsigned int)time(NULL));
    for (int i=0; i<n; i++)
        matrix[i]=rand()%10000-5000;

    memcpy(matrixx, matrix, n*sizeof(int));

    cout<<"Vremya vipolnenya sort 1"<<endl;
    cout << ((double)Sort1(matrix, n)/CLK_TCK) << endl;

    cout<<"Vremya vipolnenya sort 2"<<endl;
    cout << ((double)Sort2(matrix, n)/CLK_TCK) << endl;

    delete [] matrix;
    matrix=0;

    system ("Pause");
}

Цитата

Vvedite n
50000
Vremya vipolnenya sort 1
2.922
Vremya vipolnenya sort 2
3.896

PM   Вверх
Metalex
Дата 18.12.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



azesmcar, благодарю еще раз!


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Dancer
Дата 18.12.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 4
Всего: 37



думаю, там ошибочка небольшая закралась (точнее описочка) smile.
Оба раза один и тот же массив сортируется.
наверное должно в одном быть matrix (sort1), в другой раз matrixx (sort2).
и освобождение памяти только из под одного массива (не Айс smile ) 
наверное должно быть как-то так:
Код

......
  memset(matrix, 0, n*sizeof(int));
  memset(matrixx, 0, n*sizeof(int));
  delete[] matrix;
  delete[] matrixx;
.....



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Rodman
Дата 19.12.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122




M
Rodman
Модератор: Название темы должно содержать язык написания!

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Metalex
Дата 20.12.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Dancer, да, действительно smile

Rodman, недоглядел, прошу прощения


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.