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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 19:06   #1
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию Сортировка слиянием

Здравствуйте. Объясните пожалуйста мне строку в коде сортировке
Код:
int *merge(int *m1, int *m2, int l1, int l2){
    int *ret = new int[l1+l2];
    int n = 0;
    // slivaem massivi, poka odin ne zakonchitsya
    while (l1 && l2){
        if (*m1 < *m2){
           ret[n] = *m1;
           m1++; l1--;}
        else {
           ret[n] = *m2;
           m2++; l2--;}
       n++;}
    // esli zakonchilsya 1 massiv
    if (l1 == 0){
        for (int i=0; i<l2; i++){
            ret[n++] = *m2++;}}
    // esli zakonchilsya 2 massiv
    else {
        for (int i=0; i<l1; i++){
           ret[n++] = *m1++;}}
    return ret;}

// funkcia voshodyashego sliyania
void mergeSort(int * mas, int len){
    int n=1, l, ost;
    int * mas1;
    while (n<len){
        l=0;
        while (l<len){
           if (l+n >= len) break;
           ost = (l+n*2>len) ? (len-(l+n)) : n;    //вот эта строчка!!!!!!!
           mas1 = merge(mas+l, mas+l+n, n, ost);
           for (int i=0; i<n+ost; i++) mas[l+i] = mas1[i];
           delete [] mas1;
           l+=n*2;}
       n*=2;
}}
Aндрей вне форума Ответить с цитированием
Старый 14.04.2010, 19:15   #2
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Код:
ost = (l+n*2>len) ? (len-(l+n)) : n;
Это тернарный условный оператор.
Расшифровывается так:
Код:
if (l+n*2>len)
    ost=(len-(l+n));
else ost=n;

Последний раз редактировалось Indian; 14.04.2010 в 19:21.
Indian вне форума Ответить с цитированием
Старый 14.04.2010, 19:28   #3
Aндрей
Пользователь
 
Регистрация: 15.02.2009
Сообщений: 33
По умолчанию

А что происходит в этой части программы?
Код:
ost = (l+n*2>len) ? (len-(l+n)) : n;    //вот эта строчка!!!!!!!
           mas1 = merge(mas+l, mas+l+n, n, ost);
           for (int i=0; i<n+ost; i++) mas[l+i] = mas1[i];
           delete [] mas1;
           l+=n*2;}
       n*=2;
Мы разбиваем массив на части, сначала по 1 потом по 2 эл и т.д и все время их упорядочиваем, потом склеиваем их..? Не понимаю еще где происходит само упорядочивание?, т.е если есть допустим елементы 5 2 как они поменяются местами..
Aндрей вне форума Ответить с цитированием
Старый 15.04.2010, 09:47   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А вы возьмите словами, а не кодом, написанный алгоритм и вникните. Тогда и код понятнее станет.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка слиянием maxflint Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 05.12.2009 20:41
Сортировка слиянием файлов [MI_nor] Общие вопросы C/C++ 1 01.06.2009 20:56
Сортировка слиянием Delphi 7 xxxPascalxxx Помощь студентам 2 17.05.2009 16:09