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
| 講義内容目次 | 菅沼ホーム | 前ページ | 次ページ |