2015-02-06 3 views
-1

У меня есть задание Мне нужна небольшая помощь. Нам нужно выбрать два алгоритма сортировки в C и сравнить их эффективность. Я написал следующий код, но я не уверен, что сравнение правильное. Я думаю, что свопы в порядке. Я достаточно новичок в этом, поэтому будьте осторожны, если увидите очевидные недостатки.Считать сравнения и свопы в простой программе сортировки

#include <stdlib.h> 
#include <time.h> 
#define MAX 20 


int main(void) 
{ 
//Declare variables 
int i,x,y,temp; 
int comparsioncounter=0; 
int swapcounter=0; 
//Assign values to our array. I didn’t use random numbers so we could compare the two methods 
int array[MAX]= {3,1,5,8,7,13,17,34,22,31,28,2,17,44,23,67,32,9,12,30}; 

//start clock to time execution time 
clock_t start, end; 
start = clock(); 
printf("Unsorted array\n"); 
//print unsorted array 
for(i=0; i<MAX;i++){ 
printf("%d ",array[i]); 
} 
printf("\n"); 
//Our sort algorithm 
for (x=0; x<MAX; x++){ 
    for(i=0;i<MAX-1;i++){ 
     //counter to keep track of how many times the comparison loops 
     comparsioncounter++; 
     if(array[i]>array[i+1]) 
     { 
      temp=array[i]; 
      array[i]=array[i+1]; 
      array[i+1]=temp; 
      //Counter to keep track of how many times the comparison loops 
      swapcounter++; 
     } 
    } 

} 
      //print sorted array 
    printf("\nSorted array\n"); 
    for(i=0; i<MAX;i++){ 
    printf("%d ",array[i]); 

} 
//Print out number of comparsions and swaps 
printf("\n\nNumber of comparsions is %d\n", comparsioncounter); 
printf("Number of swaps is %d", swapcounter); 
end = clock(); 
//print out execution time 
printf("\nTime taken in seconds: %.5lf\n", ((double)(end - start))/CLOCKS_PER_SEC); 
return 0; 
} 
+0

Для очень маленьких наборов входов выполните вычисления * на бумаге *, а затем сравните с тем, что вы получаете в своей программе. Если оба они одинаковы, вы, вероятно, правы, иначе что-то не так. –

+1

'x <20; .. i <19': 20 * 19 =' 380' – BLUEPIXY

+0

Если я уменьшу массив до размера 4. Свопы правильно подсчитываются, но сравнения возвращаются 16. Я не думаю, что это правильно – niallo27

ответ

1

представляется правильным.

Другой способ сделать это, где может быть более очевидным, - написать сравнение и функцию обмена, которые подсчитывают их счетчики.

так:

static unsigned comps = 0, swaps = 0; 

int compare(int l, int r) 
{ 
    comps++; 
    return (l > r); 
} 

void swap(int *l, int *r) 
{ 
    swaps++; 
    int t = *l; 
    *l = *r; 
    *r = t; 
} 

, а затем использовать их вместо этого.

Смежные вопросы