01 /****************************/ 02 /* 比較演算 */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 #include <iostream> 06 #include <string> 07 08 using namespace std; 09 10 /********************/ 11 /* クラスTestの定義 */ 12 /********************/ 13 class Test { 14 string str; 15 int n; 16 public: 17 // コンストラクタ 18 Test (string s, int m) { 19 str = s; 20 n = m; 21 } 22 // > 演算子のオーバーロード 23 bool operator> (Test t) 24 { 25 if (n == t.n) 26 return (str > t.str) ? true : false; 27 else 28 return (n > t.n) ? true : false; 29 } 30 }; 31 32 /****************/ 33 /* main program */ 34 /****************/ 35 int main () 36 { 37 // 整数の比較 38 if (10 > 1) 39 printf("true\n"); 40 else 41 printf("false\n"); 42 // 文字列(string)の比較 43 string x = "abc", y = "xyz"; 44 if (x > y) 45 printf("true\n"); 46 else 47 printf("false\n"); 48 // クラスTestのオブジェクトの比較 49 Test t1(x, 10), t2(y, 1); 50 if (t1 > t2) 51 printf("true\n"); 52 else 53 printf("false\n"); 54 55 return 0; 56 }
true false true
01 /****************************/ 02 /* バブルソート */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 #include <stdio.h> 06 #include <time.h> 07 #include "MT.h" 08 09 /*****************************/ 10 /* データの比較(昇順) */ 11 /* a > bの場合に0以外(真) */ 12 /*****************************/ 13 int ascend(int a, int b) 14 { 15 return a > b; 16 } 17 18 /*****************************/ 19 /* データの比較(降順) */ 20 /* a < bの場合に0以外(真) */ 21 /*****************************/ 22 int descend(int a, int b) 23 { 24 return a < b; 25 } 26 27 /*************************************/ 28 /* 2つのデータを交換する */ 29 /* a,b : 2つのデータのアドレス */ 30 /*************************************/ 31 void swap(int *a, int *b) 32 { 33 int temp = *a; 34 *a = *b; 35 *b = temp; 36 } 37 38 /*********************************/ 39 /* バブルソート */ 40 /* n : データの数 */ 41 /* data : データ */ 42 /* compare : 比較を行う関数 */ 43 /*********************************/ 44 void bubble(int n, int *data, int (*compare)(int, int)) 45 { 46 int sw = 0; 47 if (n > 1) { 48 for (int i1 = 0; i1 < n-1; i1++) { 49 if (compare(data[i1], data[i1+1])) { 50 sw = 1; 51 swap(&data[i1], &data[i1+1]); 52 } 53 } 54 } 55 56 if (sw > 0) 57 bubble(n-1, data, compare); 58 } 59 60 #define N 100000 61 62 int main() 63 { 64 // 初期設定 65 int *data = new int [N]; 66 init_genrand((unsigned)time(NULL)); 67 // 昇順 68 clock_t tm1 = clock(); 69 for (int i1 = 0; i1 < N; i1++) 70 data[i1] = genrand_int31(); // [0,0x7fffffff] 71 clock_t tm2 = clock(); 72 bubble(N, data, ascend); 73 clock_t tm3 = clock(); 74 printf("昇順(データ数: %d)\n", N); 75 printf(" data %d ms\n", (int)(tm2-tm1)); 76 printf(" sort %d ms\n", (int)(tm3-tm2)); 77 // 降順 78 tm1 = clock(); 79 for (int i1 = 0; i1 < N; i1++) 80 data[i1] = genrand_int31(); 81 tm2 = clock(); 82 bubble(N, data, descend); 83 tm3 = clock(); 84 printf("降順(データ数: %d)\n", N); 85 printf(" data %d ms\n", (int)(tm2-tm1)); 86 printf(" sort %d ms\n", (int)(tm3-tm2)); 87 88 return 0; 89 }
昇順(データ数: 100000) data 0 ms sort 32471 ms 降順(データ数: 100000) data 1 ms sort 33073 ms
01 /****************************/ 02 /* 選択ソート */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 #include <stdio.h> 06 #include <time.h> 07 #include "MT.h" 08 09 /*****************************/ 10 /* データの比較(昇順) */ 11 /* a > bの場合に0以外(真) */ 12 /*****************************/ 13 int ascend(int a, int b) 14 { 15 return a > b; 16 } 17 18 /*****************************/ 19 /* データの比較(降順) */ 20 /* a < bの場合に0以外(真) */ 21 /*****************************/ 22 int descend(int a, int b) 23 { 24 return a < b; 25 } 26 27 /*************************************/ 28 /* 2つのデータを交換する */ 29 /* a,b : 2つのデータのアドレス */ 30 /*************************************/ 31 void swap(int *a, int *b) 32 { 33 int temp = *a; 34 *a = *b; 35 *b = temp; 36 } 37 38 /*********************************/ 39 /* 選択ソート */ 40 /* n : データの数 */ 41 /* data : データ */ 42 /* compare : 比較を行う関数 */ 43 /*********************************/ 44 void select(int n, int *data, int (*compare)(int, int)) 45 { 46 int i1, m; 47 48 if (n > 1) { 49 50 m = 0; 51 for (i1 = 1; i1 < n; i1++) { 52 if (compare(data[m], data[i1])) 53 m = i1; 54 } 55 56 if (m != 0) 57 swap(&data[0], &data[m]); 58 59 select(n-1, &data[1], compare); 60 } 61 } 62 63 #define N 100000 64 65 int main() 66 { 67 // 初期設定 68 int *data = new int [N]; 69 init_genrand((unsigned)time(NULL)); 70 // 昇順 71 clock_t tm1 = clock(); 72 for (int i1 = 0; i1 < N; i1++) 73 data[i1] = genrand_int31(); 74 clock_t tm2 = clock(); 75 select(N, data, ascend); 76 clock_t tm3 = clock(); 77 printf("昇順(データ数: %d)\n", N); 78 printf(" data %d ms\n", (int)(tm2-tm1)); 79 printf(" sort %d ms\n", (int)(tm3-tm2)); 80 // 降順 81 tm1 = clock(); 82 for (int i1 = 0; i1 < N; i1++) 83 data[i1] = genrand_int31(); 84 tm2 = clock(); 85 select(N, data, descend); 86 tm3 = clock(); 87 printf("降順(データ数: %d)\n", N); 88 printf(" data %d ms\n", (int)(tm2-tm1)); 89 printf(" sort %d ms\n", (int)(tm3-tm2)); 90 91 return 0; 92 }
昇順(データ数: 100000) data 1 ms sort 13680 ms 降順(データ数: 100000) data 1 ms sort 13711 ms
int data[] = {1, 4, 2, 9, 0, 2, 8, 7, 3, 5}
{9, 7, 8, 4, 5, 2, 2, 1, 3, 0} 親 [0] 子 [1], [2] 親 [1] 子 [3], [4] 親 [2] 子 [5], [6] 親 [3] 子 [7], [8] 親 [4] 子 [9]
data[k] : 親 data[k1], data[k2] : 子供,k1 = 2k+1, k2 = 2k+2 子供から見て親は:(k1-1) / 2 = (k2-1) / 2 = k
001 /****************************/ 002 /* ヒープソート */ 003 /* coded by Y.Suganuma */ 004 /****************************/ 005 #include <stdio.h> 006 #include <time.h> 007 #include <algorithm> 008 #include <utility> 009 #include <functional> 010 #include "MT.h" 011 012 using namespace std; 013 014 /*****************************/ 015 /* データの比較(昇順) */ 016 /* a > bの場合に0以外(真) */ 017 /*****************************/ 018 bool ascend(int a, int b) 019 { 020 return a < b; 021 } 022 023 /*****************************/ 024 /* データの比較(降順) */ 025 /* a < bの場合に0以外(真) */ 026 /*****************************/ 027 bool descend(int a, int b) 028 { 029 return a > b; 030 } 031 032 /**********************************/ 033 /* ヒープの生成 */ 034 /* n : データの数 */ 035 /* data : データ */ 036 /* parent : 親のインデックス */ 037 /* compare : 比較関数 */ 038 /**********************************/ 039 void heap_c(int n, int *data, int parent, bool (*compare)(int, int)) 040 { 041 // 子ノードのインデックス 042 int child = (2 * parent) + 1; 043 // 親ノードの値 044 int temp = data[parent]; 045 // ヒープの生成 046 while (child < n) { 047 // 値が大きい(小さい)ほうの子ノードを選択する。 048 if (child < n-1 && !compare(data[child + 1], data[child])) 049 child = child + 1; 050 // 親ノードの値が子ノードの値より大きい(小さい)場合は何もしない。 051 if (!compare(temp, data[child])) 052 break; 053 else { // temp が data[child] 以下(以上)の場合 054 // 親の要素に子を入れる 055 data[(child - 1) / 2] = data[child]; 056 // 子ノードのインデックスを進める。 057 child = (2 * child) + 1; 058 } 059 } 060 // 親ノードとなる要素(最後の子供)に値を入れる 061 data[(child - 1) / 2] = temp; 062 } 063 064 /***************************/ 065 /* ヒープソート */ 066 /* n : データの数 */ 067 /* data : データ */ 068 /* compare : 比較関数 */ 069 /***************************/ 070 void heap(int n, int *data, bool (*compare)(int, int)) 071 { 072 // ヒープの生成 073 // data[k] : 親 074 // data[k1], data[k2] : 子供,k1 = 2k+1, k2 = 2k+2 075 // 子供から見て親は:(k1-1) / 2 = (k2-1) / 2 = k 076 // 例 {1, 4, 2, 9, 0, 2, 8, 7, 3, 5} 077 // 結果 {9, 7, 8, 4, 5, 2, 2, 1, 3, 0} 昇順の場合 078 // 親 [0] 子 [1], [2] 079 // 親 [1] 子 [3], [4] 080 // 親 [2] 子 [5], [6] 081 // 親 [3] 子 [7], [8] 082 // 親 [4] 子 [9] 083 for (int i1 = (n-1) / 2; i1 >= 0; i1--) 084 heap_c(n, data, i1, compare); 085 // ヒープソート実行 086 for (int i1 = n - 1; i1 > 0; i1--) { 087 swap(data[0], data[i1]); // 先頭を最後と交換 088 heap_c(i1, data, 0, compare); // 残りの部分に対するヒープの生成 089 } 090 } 091 092 #define N 5000000 093 094 int main() 095 { 096 // 初期設定 097 int *data = new int [N]; 098 init_genrand((unsigned)time(NULL)); 099 // 昇順 100 clock_t tm1 = clock(); 101 for (int i1 = 0; i1 < N; i1++) 102 data[i1] = genrand_int31(); 103 clock_t tm2 = clock(); 104 heap(N, data, ascend); 105 clock_t tm3 = clock(); 106 printf("昇順(データ数: %d)\n", N); 107 printf(" data %d ms\n", (int)(tm2-tm1)); 108 printf(" sort %d ms\n", (int)(tm3-tm2)); 109 // 降順 110 tm1 = clock(); 111 for (int i1 = 0; i1 < N; i1++) 112 data[i1] = genrand_int31(); 113 tm2 = clock(); 114 heap(N, data, descend); 115 tm3 = clock(); 116 printf("降順(データ数: %d)\n", N); 117 printf(" data %d ms\n", (int)(tm2-tm1)); 118 printf(" sort %d ms\n", (int)(tm3-tm2)); 119 // 昇順(sort_heap) 120 tm1 = clock(); 121 for (int i1 = 0; i1 < N; i1++) 122 data[i1] = genrand_int31(); 123 tm2 = clock(); 124 make_heap(data, data+N); 125 sort_heap(data, data+N); 126 tm3 = clock(); 127 printf("昇順(sort_heap,データ数: %d)\n", N); 128 printf(" data %d ms\n", (int)(tm2-tm1)); 129 printf(" sort %d ms\n", (int)(tm3-tm2)); 130 // 降順(sort_heap) 131 tm1 = clock(); 132 for (int i1 = 0; i1 < N; i1++) 133 data[i1] = genrand_int31(); 134 tm2 = clock(); 135 make_heap(data, data+N, descend); // 関数 136 sort_heap(data, data+N, descend); 137 // make_heap(data, data+N, greater<int>()); // 関数オブジェクト 138 // sort_heap(data, data+N, greater<int>()); 139 // make_heap(data, data+N, [](int a, int b){ return a > b; }); // ラムダ式 140 // sort_heap(data, data+N, [](int a, int b){ return a > b; }); 141 tm3 = clock(); 142 printf("降順(sort_heap,データ数: %d)\n", N); 143 printf(" data %d ms\n", (int)(tm2-tm1)); 144 printf(" sort %d ms\n", (int)(tm3-tm2)); 145 146 return 0; 147 }
data : {1, 4, 2, 9, 0, 2, 8, 7, 3, 5} データ数 n = 10
昇順(データ数: 5000000) data 22 ms sort 1748 ms 降順(データ数: 5000000) data 25 ms sort 1695 ms 昇順(sort_heap,データ数: 5000000) data 22 ms sort 1102 ms 降順(sort_heap,データ数: 5000000) data 25 ms sort 1405 ms
講義内容目次 | 菅沼ホーム | 前ページ | 次ページ |