Re[4]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 12.03.14 07:23
Оценка:
Здравствуйте, Serg27, Вы писали:

S>Здравствуйте, Anton_Savickiy, Вы писали:

A_S>>Я еще на курсах только... Все так плохо?
S>Да, нет. Вроде все на лету схватываете. Просто сразу видно, что Вы последовательно C++ еще не изучали. Поэтому почти каждый и посоветовал почитать учебник. Желательно с начала. Если изучаете самостоятельно, то попробуйте хотя бы какой-либо онлайн курс. На Coursera вроде был курс типа "C++ для программистов С".

Спасибо большое за рекомендации, посмотрю какой-нибудь онлайн курс. С++ для меня в мере, которой заложил его Страуструпп, неизведан.
Да и запутал я, как вижу по ответам, да и сам запутался. Поэтому, собственно и создал тему.

Заметил, наверное, ожидаемую плату за абстракцию.

1)Попробовал отсортировать массив базового типа int.

#define NUM                    10000

vector<int> vecX(arr,arr+NUM);
sort(vecX.begin(), vecX.end());


и отсортировал обычной сортировкой вставками, так сказать в лоб.

#define NUM                    10000
void selectSort(int* ptr,int size)
{
    int tmp, i, j, pos;
    for(i = 0; i < size; ++i)
    { 
        pos = i; 
        tmp = ptr[i];
        for(j = i + 1; j < size; ++j) 
        {
            if (ptr[j] < tmp) 
            {
               pos = j; 
               tmp = ptr[j]; 
            }
        }
        ptr[pos] = ptr[i]; 
        ptr[i] = tmp; 
    }
}

selectSort(arr,NUM);


STL time = 2ms
selectSort time = 49ms

2) А теперь отсортируем структуры.

a) STL
struct DATA
{
    int    cmd;
    float    var;
};

struct DATA_C
{
    FILETIME    ft;
    DATA        dt[1000];
};

struct sort_rule
{
    bool operator() (DATA_C i, DATA_C j)
    {return (CompareFileTime(&i.ft,&j.ft)==-1) ? true:false;}
} sort_object;

DATA_C d[NUM];
SYSTEMTIME st;
GetLocalTime(&st);

for(int i=0;i<NUM;i++)
{    
    st.wMilliseconds = (WORD)rand()%1000;
    SystemTimeToFileTime(&st,&d[i].ft);
}

vector<DATA_C> vecObj(d,d+NUM);
sort(vecObj.begin(), vecObj.end(),sort_object);


b) selectSort

void selectSortS(DATA_C* ptr,int size)
{
    DATA_C tmp;
    int idx;
    for(int i=0;i<size;++i)
    { 
        idx = i; 
    memcpy(&tmp,&ptr[i],sizeof(DATA_C));
        for(int j=i+1;j<size;++j)
        {
        if(CompareFileTime(&ptr[j].ft,&tmp.ft)==-1)
            {
               idx = j; 
               memcpy(&tmp,&ptr[j],sizeof(DATA_C));
            }
        }

        memcpy(&ptr[idx],&ptr[i],sizeof(DATA_C));
        memcpy(&ptr[i],&tmp,sizeof(DATA_C));
    }
}

selectSortS(d,NUM);


А вот тут уже результат совсем другой. Да, сортируются всегда одинаковые массивы.

STL time = 1209ms
selectSortS time = 911ms

Конечно можно усреднить и посмотреть детальнее, но тенденция понятна.

Существуют ли какие-нибудь методы оптимизации? Или это плата за абстракцию?
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.