| 情報学部 | 菅沼ホーム | 全体目次 |
/****************************/
/* バブルソート */
/* 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
| 情報学部 | 菅沼ホーム | 全体目次 |