Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

データを配列に蓄積し、処理する際にソートする必要がある際、様々なソート方法がある。昔から簡単かつ高速にソートする手法としてはquicksortがある。

メモリ消費が少なく、貧弱なArduinoでもquicksortで高速に並び替えが出来る。以下、100個のランダムな数字の配列を作成し、クイックソートするサンプル。

参考サイト:
http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/

#define NUM_DATA	100
typedef struct SOMEDATA {
	int val;
	float time;
};
SOMEDATA data[NUM_DATA];
int num_data;

//クイックソート
int pivot(int i, int j) {
	int k = i + 1;
	while (k <= j && data[i].val == data[k].val) k++;
	if (k > j) return -1;
	if (data[i].val >= data[k].val) return i;
	return k;
}
int partition(int i, int j, int x) {
	int l = i, r = j;
	while (l <= r) {
		while (l <= j && data[l].val < x)  l++;
		while (r >= i && data[r].val >= x) r--;
		if (l > r) break;
		float t = data[l].time;
		int val = data[l].val;
		data[l].time = data[r].time;
		data[l].val = data[r].val;
		data[r].time = t;
		data[r].val = val;
		l++; r--;
	}
	return l;
}
void quickSort(int i, int j) {
	if (i == j) return;
	int p = pivot(i, j);
	if (p != -1) {
		int k = partition(i, j, data[p].val);
		quickSort(i, k - 1);
		quickSort(k, j);
	}
}
void sort() {
	quickSort(0, num_data - 1);
}

void setup() {
	Serial.begin(9600);
	randomSeed(analogRead(0));

	for (int i=0;i<NUM_DATA;i++){
		data[i].val = random(500);
		data[i].time = millis();
		Serial.println(data[i].val);
	}
	num_data = NUM_DATA;
	Serial.println("Sorting...");
	sort();

	for (int i=0;i<NUM_DATA;i++){
		Serial.println(data[i].val);
	}
}

void loop() {
	// put your main code here, to run repeatedly:

}
Print Friendly, PDF & Email

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


*

CAPTCHA