算法设计 || 第4题:字典序排列(全排列+冒泡排序)

目录

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;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值