前提
C言語でバブルソートの評価を行いました。
ランダムなデータと降順のデータ(データ数2500,10000,40000)を昇順にソートして、実行時間・交換回数を計測しました。
結果は以下の通り。
実行時間(ms) | 2500 | 10000 | 40000 |
---|---|---|---|
ランダム | 8.09 | 203.91 | 3928.74 |
降順 | 8.29 | 113.65 | 1832.24 |
交換回数(回) | 2500 | 10000 | 40000 |
---|---|---|---|
ランダム | 1545023 | 24960941 | 398801402 |
降順 | 3123750 | 49995000 | 799980000 |
[追記]
データはint型の整数で、テキストデータからint型配列へ読み出しています。
また実行時間はソートの開始から終了までを図っています。
問題
降順の方が実行時間が短くすんでいる理由が分かりません。
交換回数を見る限り、降順の方が時間がかかりそうなものですが…。
ご教授願えればと思います。
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <sys/time.h> 5#include "data.h" 6 7int swap_counter=0; 8int comparison_counter=0; 9 10/* 要素の交換 */ 11void swap(int *a, int i, int j) { 12 int t = a[i]; 13 a[i] = a[j]; 14 a[j] = t; 15#if defined(VERBOSE_MODE) || defined(COUNT_SWAP) 16 swap_counter++; 17#endif 18} 19 20/* バブルソート */ 21void bubblesort(int *a, int size) { 22 int i, j; 23 for(i=size-1; i>0; i--) { 24 for(j=0; j<i; j++) { 25#if defined(VERBOSE_MODE) || defined(COUNT_COMPARISON) 26 comparison_counter++; 27#endif 28 if (a[j]>a[j+1]) { 29 swap(a, j, j+1); 30 } 31 } 32 } 33} 34 35/* 時間計測 */ 36double get_time() { 37 struct timeval tv; 38 gettimeofday(&tv, NULL); 39 return tv.tv_sec + (double)tv.tv_usec*1e-6; 40} 41 42/* 使用法の表示 */ 43void print_usage() { 44 fprintf(stderr, "usage: bubblesort data\n"); 45} 46 47 48int main(int argc, char* argv[]) { 49 if (argc != 2) { 50 print_usage(); 51 exit(1); 52 } 53 54 FILE *fp = fopen(argv[1], "r"); 55 if (fp == NULL) { 56 fprintf(stderr, "File not found %s\n", argv[1]); 57 exit(1); 58 } 59 int size = read_size(fp); 60 int* data = read_data(fp, size); 61 fclose(fp); 62 63#ifdef VERBOSE_MODE 64 printf("ソート前\n"); 65 print_data(data, size); 66#endif 67 68 double starting_time = get_time(); 69 bubblesort(data, size); // ソート 70 double end_time = get_time(); 71 double consumed_time_in_msec = (end_time-starting_time) * 1000; 72 73#ifdef VERBOSE_MODE 74 printf("\nソート後\n"); 75 print_data(data, size); 76#endif 77 78#ifdef VERBOSE_MODE 79 printf("size: %d\n", size); 80 printf("swap: %d\n", swap_counter); 81 printf("comparison: %d\n", comparison_counter); 82 printf("time (msec): %f\n", consumed_time_in_msec); 83#else 84 85#ifdef COUNT_SWAP 86 printf("%d", swap_counter); 87#endif 88#ifdef COUNT_COMPARISON 89 printf("%d", comparison_counter); 90#endif 91#if !defined(COUNT_SWAP) && !defined(COUNT_COMPARISON) 92 printf("%f", consumed_time_in_msec); 93#endif 94 95#endif 96 97 free_data(data); 98} 99
回答2件
あなたの回答
tips
プレビュー