情報学部 | 菅沼ホーム | 全体目次 |
/****************************/ /* バブルソート */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; public class Test { public static void main(String args[]) { // 初期設定 int N = 100000; int data[] = new int [N]; Random rn = new Random(); // 昇順 long tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); long tm2 = System.currentTimeMillis(); bubble(N, data, 0); long tm3 = System.currentTimeMillis(); System.out.printf("昇順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); // 降順 tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); tm2 = System.currentTimeMillis(); bubble(N, data, 1); tm3 = System.currentTimeMillis(); System.out.printf("降順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); } /***********************************/ /* 2つのデータを交換する */ /* data : データ */ /* i,j : 2つのデータの添え字 */ /***********************************/ static void swap(int data[], int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } /***********************/ /* バブルソート */ /* n : データの数 */ /* data : データ */ /* cp : =0 : 昇順 */ /* =1 : 降順 */ /***********************/ static void bubble(int n, int data[], int cp) { int sw = 0; for (int i1 = n; i1 > 1; i1--) { for (int i2 = 0; i2 < i1-1; i2++) { if (cp == 0 && data[i2] > data[i2+1] || cp > 0 && data[i2] < data[i2+1]) { sw = 1; swap(data, i2, i2+1); } } if (sw == 0) break; } } }
昇順(データ数: 100000) data 4 ms sort 23900 ms 降順(データ数: 100000) data 2 ms sort 24941 ms
/****************************/ /* 選択ソート */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; public class Test { public static void main(String args[]) { // 初期設定 int N = 100000; int data[] = new int [N]; Random rn = new Random(); // 昇順 long tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); long tm2 = System.currentTimeMillis(); select(N, data, 0); long tm3 = System.currentTimeMillis(); System.out.printf("昇順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); // 降順 tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); tm2 = System.currentTimeMillis(); select(N, data, 1); tm3 = System.currentTimeMillis(); System.out.printf("降順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); } /***********************************/ /* 2つのデータを交換する */ /* data : データ */ /* i,j : 2つのデータの添え字 */ /***********************************/ static void swap(int data[], int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } /***********************/ /* 選択ソート */ /* n : データの数 */ /* data : データ */ /* cp : =0 : 昇順 */ /* =1 : 降順 */ /***********************/ static void select(int n, int data[], int cp) { int k = 0; for (int i1 = n; i1 > 1; i1--) { int m = k; for (int i2 = k+1; i2 < n; i2++) { if (cp == 0 && data[m] > data[i2] || cp > 0 && data[m] < data[i2]) m = i2; } if (m != k) swap(data, k, m); k++; } } }
昇順(データ数: 100000) data 4 ms sort 11876 ms 降順(データ数: 100000) data 2 ms sort 12058 ms
/****************************/ /* バケツソート */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; public class Test { public static void main(String args[]) { // 初期設定 int N = 5000000; int data[] = new int [N]; int num[] = new int [10]; int bu[][] = new int [10][]; for (int i1 = 0; i1 < 10; i1++) bu[i1] = new int [N]; Random rn = new Random(); // 昇順 long tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = Math.abs(rn.nextInt()); long tm2 = System.currentTimeMillis(); bucket(N, data, 0, 1, bu, num); long tm3 = System.currentTimeMillis(); System.out.printf("昇順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); // 降順 tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = Math.abs(rn.nextInt()); tm2 = System.currentTimeMillis(); bucket(N, data, 1, 1, bu, num); tm3 = System.currentTimeMillis(); System.out.printf("降順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); } /********************************************/ /* バケツソート */ /* n : データの数 */ /* data : データ */ /* cp : 比較方法(=0 : 昇順,=1 : 降順 */ /* k : 桁 */ /* bu : バケツ */ /* num : 各バケツに入っているデータ数 */ /********************************************/ static void bucket(int n, int data[], int cp, int k, int bu[][], int num[]) { int kk = 1, sw1 = 1, sw2 = 0; // 準備 for (int i1 = 0; i1 < k-1; i1++) kk *= 10; for (int i1 = 0; i1 < 10; i1++) num[i1] = 0; // 分配パス for (int i1 = 0; i1 < n; i1++) { if (data[i1] >= 10*kk) sw2 = 1; int k1 = (data[i1] / kk) % 10; if (num[k1] >= n-1) sw1 = 0; else { bu[k1][num[k1]] = data[i1]; num[k1]++; } } // 収集パス if (sw1 > 0) { int k1 = 0; if (cp == 0) { for (int i1 = 0; i1 < 10; i1++) { for (int i2 = 0; i2 < num[i1]; i2++) { data[k1] = bu[i1][i2]; k1++; } } } else { for (int i1 = 9; i1 >= 0; i1--) { for (int i2 = 0; i2 < num[i1]; i2++) { data[k1] = bu[i1][i2]; k1++; } } } } // 次の桁 if (k < 10 && sw2 > 0) bucket(n, data, cp, k+1, bu, num); } }
昇順(データ数: 5000000) data 93 ms sort 639 ms 降順(データ数: 5000000) data 91 ms sort 608 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
/****************************/ /* ヒープソート */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; public class Test { public static void main(String args[]) { // 初期設定 int N = 5000000; int data[] = new int [N]; Random rn = new Random(); // 昇順 long tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = Math.abs(rn.nextInt()); long tm2 = System.currentTimeMillis(); heap(N, data, 0); long tm3 = System.currentTimeMillis(); System.out.printf("昇順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); // 降順 tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = Math.abs(rn.nextInt()); tm2 = System.currentTimeMillis(); heap(N, data, 1); tm3 = System.currentTimeMillis(); System.out.printf("降順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); } /***********************************/ /* 2つのデータを交換する */ /* data : データ */ /* i,j : 2つのデータの添え字 */ /***********************************/ static void swap(int data[], int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } /**********************************/ /* ヒープの生成 */ /* n : データの数 */ /* data : データ */ /* parent : 親のインデックス */ /* cp : =0 : 昇順 */ /* =1 : 降順 */ /**********************************/ static void heap_c(int n, int data[], int parent, int cp) { // 子ノードのインデックス int child = (2 * parent) + 1; // 親ノードの値 int temp = data[parent]; // ヒープの生成 while (child < n) { // 値が大きい(小さい)ほうの子ノードを選択する。 if (child < n-1 && (cp == 0 && data[child + 1] > data[child] || cp > 0 && data[child + 1] < data[child])) child = child + 1; // 親ノードの値が子ノードの値より大きい(小さい)場合は何もしない。 if (cp == 0 && temp > data[child] || cp > 0 && temp < data[child]) break; else { // temp が data[child] 以下(以上)の場合 // 親の要素に子を入れる data[(child - 1) / 2] = data[child]; // 子ノードのインデックスを進める。 child = (2 * child) + 1; } } // 親ノードとなる要素(最後の子供)に値を入れる data[(child - 1) / 2] = temp; } /***********************/ /* ヒープソート */ /* n : データの数 */ /* data : データ */ /* cp : =0 : 昇順 */ /* =1 : 降順 */ /***********************/ static void heap(int n, int data[], int cp) { // ヒープの生成 // data[k] : 親 // data[k1], data[k2] : 子供,k1 = 2k+1, k2 = 2k+2 // 子供から見て親は:(k1-1) / 2 = (k2-1) / 2 = k // 例 {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] for (int i1 = (n-1) / 2; i1 >= 0; i1--) heap_c(n, data, i1, cp); // ヒープソート実行 for (int i1 = n - 1; i1 > 0; i1--) { swap(data, 0, i1); // 先頭を最後と交換 heap_c(i1, data, 0, cp); // 残りの部分に対するヒープの生成 } } }
昇順(データ数: 5000000) data 94 ms sort 1877 ms 降順(データ数: 5000000) data 94 ms sort 1901 ms
/****************************/ /* クイックソート */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.*; public class Test { public static void main(String args[]) { // 初期設定 int N = 5000000; int data[] = new int [N]; Random rn = new Random(); // 昇順 long tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); long tm2 = System.currentTimeMillis(); quick(0, N, data, 0); long tm3 = System.currentTimeMillis(); System.out.printf("昇順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); tm2 = System.currentTimeMillis(); Arrays.sort(data); tm3 = System.currentTimeMillis(); System.out.printf(" ***Arrays.sort の利用***\n"); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); // 降順 tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data[i1] = rn.nextInt(); tm2 = System.currentTimeMillis(); quick(0, N, data, 1); tm3 = System.currentTimeMillis(); System.out.printf("降順(データ数: %d)\n", N); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); Integer data1[] = new Integer [N]; tm1 = System.currentTimeMillis(); for (int i1 = 0; i1 < N; i1++) data1[i1] = new Integer(rn.nextInt()); tm2 = System.currentTimeMillis(); Comparator<Integer> cp = new Comp(); Arrays.sort(data1, cp); tm3 = System.currentTimeMillis(); System.out.printf(" ***Arrays.sort の利用***\n"); System.out.printf(" data %d ms\n", tm2-tm1); System.out.printf(" sort %d ms\n", tm3-tm2); } /***********************************/ /* 2つのデータを交換する */ /* data : データ */ /* i,j : 2つのデータの添え字 */ /***********************************/ static void swap(int data[], int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } /*****************************/ /* クイックソート */ /* p : 先頭インデックス */ /* n : データの数 */ /* data : データ */ /* cp : =0 : 昇順 */ /* =1 : 降順 */ /*****************************/ static void quick(int p, int n, int data[], int cp) { int left = p+1, right = p+n-1, pos = p, sw1 = 1, sw2; // 枢軸要素を正しい位置に置く while (sw1 > 0) { sw1 = 0; if (right-pos > 0) { sw2 = 0; for (int i1 = right; i1 > pos && sw2 == 0; i1--) { if (cp == 0 && data[pos] > data[i1] || cp > 0 && data[pos] < data[i1]) { swap(data, pos, i1); sw1 = 1; sw2 = 1; pos = i1; right = i1 - 1; } } } if (pos-left > 0) { sw2 = 0; for (int i1 = left; i1 < pos && sw2 == 0; i1++) { if (cp == 0 && data[i1] > data[pos] || cp > 0 && data[i1] < data[pos]) { swap(data, pos, i1); sw1 = 1; sw2 = 1; pos = i1; left = i1 + 1; } } } if (right-pos <= 0) sw1 = 0; } // サブ配列の処理 if (pos > p+1) quick(p, pos-p, data, cp); if (pos < p+n-2) quick(pos+1, p+n-1-pos, data, cp); } } class Comp implements Comparator <Integer> { public int compare (Integer arg1, Integer arg2) { return arg2.compareTo(arg1); } }
昇順(データ数: 5000000) data 87 ms sort 956 ms ***Arrays.sort の利用*** data 84 ms sort 480 ms 降順(データ数: 5000000) data 86 ms sort 1057 ms ***Arrays.sort の利用*** data 750 ms sort 3106 ms
情報学部 | 菅沼ホーム | 全体目次 |