LINUX.ORG.RU

Счётчик перестановок и сравнений

 , ,


0

2

Реализовал 2 сортировки - пузырёк и двухпутевое слияние. На пузырьке счётчик перестановок и сравнений работает хорошо, а вот для двухпутевого слияние сделал только счётчик перестановок. А вот счётчик сравнеий пока не знаю куда ставить. Сам код :


   int counS=0; //счётчик сравнений
   int counP=0; //счётчик перестановок
  
//... 
int  Merge(int first, int last)
  {
 int middle, start, final, j;
 int buff[N];
 middle=(first+last)/2; //делим массив
 start=first; //начало левой части
 final=middle+1; //начало правой части

  for(j=first; j<=last; j++) //от начала до конца
   {

 if ((start<=middle) && ((final>last) || (sts[start].oklad < sts[final].oklad)))
  {

  counP+=final-(middle+1);

  buff[j]=sts[start].oklad;
  start++;
  
   }
   else
   {
  buff[j]=sts[final].oklad;
   final++;
    
   }
     }

 //возвращение результата в список

  for (j=first; j<=last; j++)
  sts[j].oklad=buff[j];
  return counP;
  }


//рекурсивная процедура сортировки
 void MergeSort(int first, int last)
  {
     
    if (first<last)
    {
        MergeSort(first, (first+last)/2);        //сортируем левую часть
        MergeSort((first+last)/2+1, last);      //сортируем правую часть
        Merge(first, last);                     //сливаем две части

     }


}

Полный код сюда не лил, ибо простыня http://pastebin.com/3za7Z245
Заранее спасибо.



Последнее исправление: cetjs2 (всего исправлений: 2)
bool incCounS(bool expr) {
  counS++;
  return expr;
}
...
  if (incCounS(start<=middle) && (incCounS(final>last) || incCounS(sts[start].oklad < sts[final].oklad)))
...
anonymous
()
Ответ на: комментарий от anonymous

Спасибо, работает. Вот только многовато выходит, может так и нужно.

Junior_C
() автор топика

if ((start<=middle) && ((final>last) || (sts[start].oklad < sts[final].oklad)))

вот это условие запиши по-человечески, а не одностроком. Ты кого хочешь запутать-то? Пока только себя. Твои макароны даже комментировать никто не хочет...

emulek
()
Ответ на: комментарий от Junior_C

если записать это в несколько if`ов, то будет код длиннее и ненамного понятнее

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

Впрочем — делай как хочешь, твои проблемы. Если нравится писать говнокод — пиши. Только не удивляйся, что тебя детектируют как говнокодера, по первой же строчке.

emulek
()
Ответ на: комментарий от Junior_C

Даже так намного читабельней

if ( (start <= middle) && (final > last) ) {
//stuff
} else if ( (start <= middle) && (sts[start].oklad < sts[final].oklad) ) {
 //stuff 
}
или
if (start <= middle) {
    if (final > last) {
        //stuff 
    }
    else if (sts[start].oklad < sts[final].oklad) {
        //stuff 
    }
}

x4DA ★★★★★
()
Последнее исправление: x4DA (всего исправлений: 1)

Чем дальше я читал код, тем шире у меня становились глаза... Это песец...

fornlr ★★★★★
()
Ответ на: комментарий от kamre

чем тебя не устраивает код, генерируемый рад студией ?

anonymous
()
Ответ на: комментарий от fornlr

спасибо, одним говнокодом меньше ) А счётчики правильно считают ? у меня сомнения в правильности их подсчётов

anonymous
()
Ответ на: комментарий от anonymous

А счётчики правильно считают ? у меня сомнения в правильности их подсчётов

думаешь, они тебя дурят и пользуясь твоей наивностью п$%#@т итерации?

arkhnchul ★★★
()
Ответ на: комментарий от fornlr

А если последний символ не \n работает? В смысле, «1\n2» — должно быть две строки.

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.