字典序法实现全排列
- 算法思想在permutation( ) 函数中体现
- 代码要求:
输入一个数,将从 1 ~ n 的全排列打印出
A. 字典序算法思想:
- 从右往左, 找到第一个右邻大于自己的数Array[a]
- 从右往左, 找出第一个大于Array[a]的数,记为Array[b]
- 交换Array[a]和Array[b]
- 将交换前Array[a]下标 “后面的” 数据由小往大排列
B. 例:输入5
C. 具体代码
#include <stdio.h>
void permutation(int n);
void creatArray(int array[], int n);
int calculate(int n);
void print(int array[], int n);
int getArray_A(int array[], int n);
int getArray_B(int array[], int array_a, int n);
void swap(int *a, int *b);
void sort(int array[], int start, int end);
int main(void)
{
int n;
printf("Please input a number:");
scanf("%d", &n);
permutation(n);
return 0;
}
void permutation(int n){
int Array[n];
int num_permutation;
int Array_A,Array_B;
creatArray(Array, n);
num_permutation = calculate(n);
for(int i=0; i<num_permutation; i++){
print(Array, n);
Array_A = getArray_A(Array, n);
Array_B = getArray_B(Array, Array_A, n);
swap(Array+Array_A, Array+Array_B);
sort(Array, Array_A+1, n);
}
}
void creatArray(int array[], int n){
for(int i=0; i<n; i++){
array[i] = i+1;
}
return array;
}
int calculate(int n){
int num = 1;
for(int i=1; i<=n; i++){
num *= i;
}
return num;
}
void print(int array[], int n){
for(int i=0; i<n; i++){
printf("%d", array[i]);
}
printf("\n");
}
int getArray_A(int array[], int n){
for(int i=n; i>0; i--){
if(array[i-1] < array[i]){
return i-1;
}
}
}
int getArray_B(int array[], int array_A, int n){
for(int i=n; i>0; i--){
if(array[i] > array[array_A]){
return i;
}
}
}
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
void sort(int array[], int start, int end){
for(int i=0; i<end-start-1; i++){
for(int k=start; k<end-i-1; k++){
if(array[k] > array[k+1]){
int temp = array[k];
array[k] = array[k+1];
array[k+1] = temp;
}
}
}
}