目录
n个元素1,2,.n,有n!个不同的排列,将这n!个排列按字典序排列,并编号为0, 1, ..n!-1 ,每个排列的编号为其字典序值,求n=6的。
n个元素1,2,.n,有n!个不同的排列,将这n!个排列按字典序排列,并编号为0, 1, ..n!-1 ,每个排列的编号为其字典序值,求n=6的。
(一)我的草书
(二)代码给您呈上
特别说明:本题多亏文洁大宝贝的点拨,让我茅策顿开!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//大毛
//交换2个数
void swap(int* x, int* y)
{
int tmp = *y;
*y = *x;
*x = tmp;
}
//从大到小,冒泡排序
void bubbleSort(int list[], int start, int end)
{
int i, j;
for (i = 0; i <= end - start; i++)
{
for (j = start; j <= end - i - 1; j++)
{
if (list[j] > list[j + 1])
swap(&list[j], &list[j + 1]);
}
}
}
//字典排序
int* permutation(int list[], int n,int count)
{
int i = 0, j = 0, m = 0, k = 0, a, b;
int *lists = (int*)malloc(sizeof(int) * count);
for (k = 0; k < count; k++) //进行count次循环
{
int sum = 0;
for (i = 0; i < n; i++) //输出排好的数组,第一次直接按最小的输出
{
sum = (list[i] * pow(10 ,(n-i-1))) + sum;
printf("%d", list[i]);
}
printf("\n");
lists[k] = sum;
//1、获取list[a]值
for (j = n - 1; j > 0; j--)
{
if (list[j - 1] < list[j])
{
a = j - 1;
break;
}
}
//2、获取list[b]的值
for (m = n - 1; m >= 0; m--)
{
if (list[m] > list[a])
{
b = m;
break;
}
}
swap(&list[a], &list[b]); //3、交换
bubbleSort(list, a + 1, n-1); //4、排序
}
return lists;
}
int main()
{
printf("大毛\n");
int n = 6;
int i;
int count = 1;
//n!共count个排序序列
for (i = 1; i <= n; i++)
count *= i;
//初始化,放入{123456}
int list1[6];
for (i = 0; i < 6; i++)
list1[i] = i + 1;
int *lists = permutation(list1, 6,count);
int num = 0;
printf("请输入要查询的序列:");
scanf("%d", &num);
for (i = 0; i < count; i++)
{
if (num == lists[i])
{
printf("它对应的编号是%d,它的下一个序列是%d", i, lists[i + 1]);
break;
}
}
return 0;
}