[ create a new paste ] login | about

Link: http://codepad.org/CNMO7Tli    [ raw code | output | fork ]

C, pasted on Sep 23:
/*
	順列生成。

	数列長をNとする。
	N - 1桁の数の次に大きい数を探してN - 1桁と交換。
	N - 1桁より後ろの数について、昇順にならべてから入れなおす。
	順列1つ生成終わり。
	N - 1桁の数の次に大きい数が見つからなかったら、
	N - 2桁の数の次に大きい数を探してN - 2桁と交換。
	N - N桁でも見つからなかったら順列生成完了。
*/

#include <stdio.h>

int nextPermutation(int num[], int length) {
	int tmp, min, max;
	int flag = 1;
	int cnt;
	int i = length - 2, j, k;

	// 探索。
	while( i >= 0 && flag == 1 ) {
		max = 10;
		cnt = 0;
		for( j = length - 1; ; j-- ) {
			if( num[i] < num[j] && num[j] <= max ) {
				max = num[j];
				tmp = j;
				cnt++;
			}
			if( j == i ) {
				if( cnt == 0 ) {
					i--;
					break;
				} else {
					flag = 0;
					break;
				}
			}
		}
	}

	// 生成完了。
	if( i < 0 ) {
		return 0;
	}

	// 交換。
	j = tmp;
	tmp = num[i]; num[i] = num[j]; num[j] = tmp;

	// ソート。
	if( i != length - 2 ) {
		for( j = i + 1; j < length; j++ ) {
			min = length - 1;
			for( k = length - 1; k >= j; k-- ) {
				if( num[min] > num[k] ) {
					min = k;
				}
			}
			tmp = num[j]; num[j] = num[min]; num[min] = tmp;
		}
	}

	return 1;
}

void print(int a[], int length) {
	int i;

	for( i = 0; i < length; i++ ) {
		printf("%d ", a[i]);
	}
	printf("\n");

	return;
}

int main(void) {
	int a[] = { 1, 2, 3, 4, 5 };
	int length = sizeof(a) / sizeof(a[0]);

	do { 
		print(a, length);
	} while( nextPermutation(a, length) );

	return 0;
}


Output:
1 2 3 4 5 
1 2 3 5 4 
1 2 4 3 5 
1 2 4 5 3 
1 2 5 3 4 
1 2 5 4 3 
1 3 2 4 5 
1 3 2 5 4 
1 3 4 2 5 
1 3 4 5 2 
1 3 5 2 4 
1 3 5 4 2 
1 4 2 3 5 
1 4 2 5 3 
1 4 3 2 5 
1 4 3 5 2 
1 4 5 2 3 
1 4 5 3 2 
1 5 2 3 4 
1 5 2 4 3 
1 5 3 2 4 
1 5 3 4 2 
1 5 4 2 3 
1 5 4 3 2 
2 1 3 4 5 
2 1 3 5 4 
2 1 4 3 5 
2 1 4 5 3 
2 1 5 3 4 
2 1 5 4 3 
2 3 1 4 5 
2 3 1 5 4 
2 3 4 1 5 
2 3 4 5 1 
2 3 5 1 4 
2 3 5 4 1 
2 4 1 3 5 
2 4 1 5 3 
2 4 3 1 5 
2 4 3 5 1 
2 4 5 1 3 
2 4 5 3 1 
2 5 1 3 4 
2 5 1 4 3 
2 5 3 1 4 
2 5 3 4 1 
2 5 4 1 3 
2 5 4 3 1 
3 1 2 4 5 
3 1 2 5 4 
3 1 4 2 5 
3 1 4 5 2 
3 1 5 2 4 
3 1 5 4 2 
3 2 1 4 5 
3 2 1 5 4 
3 2 4 1 5 
3 2 4 5 1 
3 2 5 1 4 
3 2 5 4 1 
3 4 1 2 5 
3 4 1 5 2 
3 4 2 1 5 
3 4 2 5 1 
3 4 5 1 2 
3 4 5 2 1 
3 5 1 2 4 
3 5 1 4 2 
3 5 2 1 4 
3 5 2 4 1 
3 5 4 1 2 
3 5 4 2 1 
4 1 2 3 5 
4 1 2 5 3 
4 1 3 2 5 
4 1 3 5 2 
4 1 5 2 3 
4 1 5 3 2 
4 2 1 3 5 
4 2 1 5 3 
4 2 3 1 5 
4 2 3 5 1 
4 2 5 1 3 
4 2 5 3 1 
4 3 1 2 5 
4 3 1 5 2 
4 3 2 1 5 
4 3 2 5 1 
4 3 5 1 2 
4 3 5 2 1 
4 5 1 2 3 
4 5 1 3 2 
4 5 2 1 3 
4 5 2 3 1 
4 5 3 1 2 
4 5 3 2 1 
5 1 2 3 4 
5 1 2 4 3 
5 1 3 2 4 
5 1 3 4 2 
5 1 4 2 3 
5 1 4 3 2 
5 2 1 3 4 
5 2 1 4 3 
5 2 3 1 4 
5 2 3 4 1 
5 2 4 1 3 
5 2 4 3 1 
5 3 1 2 4 
5 3 1 4 2 
5 3 2 1 4 
5 3 2 4 1 
5 3 4 1 2 
5 3 4 2 1 
5 4 1 2 3 
5 4 1 3 2 
5 4 2 1 3 
5 4 2 3 1 
5 4 3 1 2 
5 4 3 2 1 


Create a new paste based on this one


Comments: