一篇文章带你搞懂---全排序

顾得泉:个人主页
个人专栏:《Linux操作系统》 《C/C++》 《LeedCode刷题》
键盘敲烂,年薪百万!
全排序(Permutation)是指将一组元素按照一定的顺序进行排列的过程。在计算机科学中,全排序是一个经典的问题,常用于解决排列组合、搜索和优化等领域的算法设计。
具体来说,全排序是指对于给定的n个元素,将它们按照不同的顺序进行排列,得到所有可能的排列结果。例如,对于3个元素{1, 2, 3},全排序的结果为{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}、{3, 2, 1}共6种排列方式。
一、C语言基础实现
在C语言中,可以使用递归的方式来实现全排列。具体步骤如下:
- 定义一个递归函数,接受一个数组和两个整数作为参数。其中,数组存储待排列的元素,第一个整数表示当前排列的起始位置,第二个整数表示当前排列的结束位置。
- 当起始位置等于结束位置时,表示已经完成了一种排列,可以将当前排列输出。
- 从起始位置开始,依次将每个元素与起始位置交换,并递归调用函数,将起始位置后移一位。
- 在递归调用结束后,需要将交换过的元素还原回原来的位置,以便进行下一次交换。
- 重复步骤3和步骤4,直到起始位置等于结束位置。
以下是使用递归方式实现全排序的示例代码:
#include <stdio.h>// 交换两个元素的值
void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}// 全排序递归函数
void permute(int* arr, int start, int end)
{if (start == end) {// 打印当前排列结果for (int i = 0; i <= end; i++) {printf("%d ", arr[i]);}printf("\n");}else {for (int i = start; i <= end; i++) {// 交换第start个元素与第i个元素swap(&arr[start], &arr[i]);// 递归生成下一层排列permute(arr, start + 1, end);// 恢复交换前的状态,以便进行下一次交换swap(&arr[start], &arr[i]);}}
}int main()
{int arr[] = { 1, 2, 3 };int n = sizeof(arr) / sizeof(arr[0]);printf("全排序结果:\n");permute(arr, 0, n - 1);return 0;
}
运行以上代码,将会输出全排序的结果:

二、调用库函数实现
还有一种更便捷的实现方式就是使用C语言中的库函数next_permutation,以下我用c++进行库函数使用代码展示:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {vector<int> nums = { 1, 2, 3 };// 对nums进行全排列cout << "全排序结果:" << endl;do {for (int num : nums) {cout << num << " ";}cout << endl;} while (next_permutation(nums.begin(), nums.end()));return 0;
}
运行以上代码,将会输出全排序的结果:

对比来说,调用库函数结果相同,并且对我们来说更容易实现相应操作,所以大家赶快练起来。
三、实战演练
题目描述
人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。
火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为 1,2,3,⋯1,2,3,⋯。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。
一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 1,2,3,41,2,3,4 和 55,当它们按正常顺序排列时,形成了 55 位数 1234512345,当你交换无名指和小指的位置时,会形成 55 位数 1235412354,当你把五个手指的顺序完全颠倒时,会形成 5432154321,在所有能够形成的 120120 个 55 位数中,1234512345 最小,它表示 11;1235412354 第二小,它表示 22;5432154321 最大,它表示 120120。下表展示了只有 33 根手指时能够形成的 66 个 33 位数和它们代表的数字:
| 三进制数 | 代表的数字 |
|---|---|
| 123123 | 11 |
| 132132 | 22 |
| 213213 | 33 |
| 231231 | 44 |
| 312312 | 55 |
| 321321 | 66 |
现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。
输入格式
共三行。
第一行一个正整数 N,表示火星人手指的数目(1≤N≤10000)
第二行是一个正整数 M,表示要加上去的小整数(1≤M≤100)
下一行是 1 到 N 这 N 个整数的一个排列,用空格隔开,表示火星人手指的排列顺序
输出格式
N 个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。
输入输出样例
输入:

输出:
![]()
参考代码:
#include<bits/stdc++.h>
using namespace std;
int n, m, arr[10001];
int main()
{cin >> n >> m;for(int i = 1; i <= n; i++)cin >> arr[i];for(int i = 1; i <= m; i++)next_permutation(arr + 1, arr + 1 + n);for(int i = 1; i < n; i++)cout << arr[i] << ' ';cout << arr[n];return 0;
}
结语:关于全排序的简单分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言,最后祝大家新的一年里学业有成,天天开心~~~
相关文章:
一篇文章带你搞懂---全排序
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 全排序(Permutation)是指将一组元素按照一定的顺序进行排列的过程。在计算机科学中,全排序是一…...
提升问题检索的能力
事实上,在信息极度丰富的时代,信息检索和筛选能力格外重要。一些搜索引擎的出现已极大地方便了我们日常的信息检索,此处需要注意的是我们不能仅仅局限于常见的搜索引擎,也需要关注和积累一些专业平台或是具有集成功能的引擎&#…...
软件测试|SQLAlchemy query() 方法查询数据
简介 上一篇文章我们介绍了SQLAlchemy 的安装和基础使用,本文我们来详细介绍一下如何使用SQLAlchemy的query()方法来高效的查询我们的数据。 创建模型 我们可以先创建一个可供我们查询的模型,也可以复用上一篇文章中我们创建的模型,代码如…...
FlinkCDC的分析和应用代码
前言:原本想讲如何基于Flink实现定制化计算引擎的开发,并以FlinkCDC为例介绍;发现这两个在表达上不知以谁为主,所以先分析FlinkCDC的应用场景和技术实现原理,下一篇再去分析Flink能在哪些方面,做定制化计算…...
序章 搭建环境篇—准备战士的剑和盾
第一步:安装node.js Node.js 内置了npm,只要安装了node.js,就可以直接使用 npm,官网地址: Download | Node.js 在这里不建议安装最新版本的node.js,可以选跟我一样的版本,node版本v16.13.2 链…...
【C++】vector的使用及模拟实现
目录 一、vector的介绍及使用1.1 介绍vector1.2 vector的使用1.2.1 构造1.2.2 遍历访问1.2.3 容量空间1.2.4 增删查改 二、vector的模拟实现2.1 成员变量2.2 迭代器相关函数2.3 构造-析构-赋值重载2.3.1 无参构造2.3.2 有参构造12.3.3 有参构造22.3.4 拷贝构造2.3.5 赋值重载2.…...
【数据库】sql优化有哪些?从query层面和数据库层面分析
目录 归纳sql本身的优化数据库层面的优化 归纳 这类型问题可以称为:Query Optimization,从清华AI4DB的paper list中,该类问题大致可以分为: Query RewriterCardinality EstimationCost EstimationPlan Optimization 从中文的角…...
nginx基本优化
安装nginx隐藏版本号 查看百度web服务器 [rootcjq11 ~]# curl -I http://www.baidu.com 隐藏nginx服务器版本号 [rootcjq11 ~]# cd /usr/local/src/nginx-1.22.0/ [rootcjq11 nginx-1.22.0]# vim src/core/nginx.h第13、14行修改版本号和服务器名称 [rootcjq11 nginx-1.2…...
软件测试|使用selenium处理单选框和多选框
简介 我们在web自动化测试工作中,经常会遇到对单选框(Radio Buttons)或者多选框(Checkboxes)进行操作的场景,单选框和多选框主要是用于我们做出选择或提交数据。本文将主要介绍selenium对于单选框和多选框…...
openssl3.2 - EVP_CIPHER_fetch算法名称字符串(参数2)的有效值列表
文章目录 openssl3.2 - EVP_CIPHER_fetch算法名称字符串(参数2)的有效值列表概述如何找到算法名称字符串列表?openssl-3.2.0\providers\implementations\include\prov\names.h备注END openssl3.2 - EVP_CIPHER_fetch算法名称字符串(参数2)的有效值列表 概述 进行加解密时, 先…...
vue3中的hook公共函数封装及运用
vue3 中的 hooks 就是函数的一种写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中,或者说是一些可以复用的公共方法/功能 使用Vue3的组合API封装的可复用的功能函数自定义hook的作用类似于vue2中的mixin技术自定义Hook…...
广州市工信局、天河区商务金融局及广州专精特新促进会走访思迈特
2024年1月11日下午,广州市工信局、天河区商务金融局及广州专精特新促进会相关负责人莅临广州思迈特软件总部调研指导,思迈特软件总裁兼COO姚诗成代表公司热情接待,并陪同调研。 调研组实地参观了思迈特软件,深入了解了思迈特发展历…...
vi编辑器显示行号和不显示行号切换命令
文章目录 1.临时生效只需要在vi编辑器里面输入1.1.显示行号1.2.不显示行号 2.永久生效 1.临时生效只需要在vi编辑器里面输入 1.1.显示行号 set number 或者 set nu如下图 1.2.不显示行号 set nonumber 或者 set nonu2.永久生效 首先打开配置文件/etc/vim/vimrc,向文件中添…...
使用 LLVM clang C/C++ 编译器编译 boost 基础框架类库
1、下载 boost 1.84 库的源代码放到待编译目录 2、解压并接入 boost 1.84 库源码的根目录 搜索默认的 clang 版本,WSL 2.0/Ubuntu 18.04 LTS 为 clang 6.x 执行命令: ./bootstrap.sh --with-toolsetclang ./b2 toolsetclang 另外一个方法比较麻烦需要…...
推荐一款.NET开发的物联网开源项目
物联网(IoT)是一个正在快速发展的技术领域,它涉及到各种设备、物体和系统的互联。所以各种物联网平台和物联网网关项目层出不穷,在物联网(IoT)领域,.NET平台扮演着重要的角色。作为一款广泛使用…...
正则表达式 (用于灵活匹配文本的表达式)
目录 . * . 用于匹配任意单个字符,除了换行符。 例如使用正则表达式 a.b, 它可以匹配aab、acb、a#b * 用于匹配前一个字符零次或多次。 例如,使用正则表达式 ab*c,它可以匹配 "ac"、"abc"、"abbc"&#…...
基于4G数采终端的供热管网在线监测方案
我国大部地区全面进入到冬季,北方各地已开启冬季供暖,以保障居民生活所需。由于城市化的发展,城市内各供热区域愈发分散、供热管道漫长、供热环境复杂,对于供热管网及换热站点的监测和维护提出了诸多挑战。 方案介绍 针对提高供热…...
OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换[一]
前言 在现代工业自动化领域,OPC UA(开放性生产控制和统一架构)是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用,帮助读者更好地理解这一概念。 一、OPC UA的定义 OPC UA全称为“开放性生产控制和统一…...
2019年认证杯SPSSPRO杯数学建模B题(第二阶段)外星语词典全过程文档及程序
2019年认证杯SPSSPRO杯数学建模 基于统计和迭代匹配的未知语言文本片段提取模型 B题 外星语词典 原题再现: 我们发现了一种未知的语言,现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本,但每段文本只是由字母…...
NFS的共享与挂载
一、NFS网络文件服务 1.1简介 NFS(Network File System 网络文件服务) 文件系统(软件)文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。 通过使用 NFS 协议,客户机可以像访…...
量子软件不稳定测试检测:基于机器学习的自动化解决方案
1. 量子软件测试中的“幽灵”:不稳定测试的挑战与机遇在量子软件开发的日常工作中,最让人头疼的莫过于那些“薛定谔的测试”——你永远不知道下一次运行它会通过还是失败。这就是不稳定测试(Flaky Tests),它们像幽灵一…...
高维数据压缩:秩-1格点与双曲交叉方法原理与应用
1. 项目概述:高维数据压缩的格点与双曲交叉方法在科学计算和工程仿真中,我们常常需要处理由海量样本点构成的高维数据集。想象一下,你正在模拟一架飞机的气动性能,或者评估一个复杂金融模型的风险,每一次仿真都可能产生…...
量子计算中的李群与李代数:从数学基石到时间最优控制实践
1. 从对称性到量子操控:李群与李代数的核心角色 在量子信息处理的世界里,我们每天都在与“对称性”打交道。一个量子比特的旋转,一个多体纠缠态的演化,甚至一个量子算法的设计,其背后都隐藏着一种优美的数学结构——连…...
仅剩72小时!Claude ROI计算模型企业定制版限时开放API对接权限(含AWS/Azure/GCP原生适配器)
更多请点击: https://codechina.net 第一章:Claude ROI计算模型企业定制版核心价值与限时策略 Claude ROI计算模型企业定制版并非通用模板的简单参数调整,而是基于客户实际业务流、成本结构与AI应用成熟度深度耦合的量化决策引擎。其核心价值…...
LeetCode 238:除自身以外数组的乘积 | 前缀积与后缀积
LeetCode 238:除自身以外数组的乘积 | 前缀积与后缀积 引言 除自身以外数组的乘积(Product of Array Except Self)是 LeetCode 第 238 题,难度为 Medium。题目要求在 O(n) 时间内不使用除法计算每个元素除自身以外所有其他元素的乘…...
FPGA在材料测试中的高精度控制与并行处理应用
1. FPGA在材料测试领域的革新价值 材料测试设备作为工业质量控制的核心装备,其性能直接影响着从汽车安全气囊到医疗植入物的产品可靠性。传统基于通用微控制器的测试系统正面临三大技术瓶颈:首先是测试标准迭代速度快,ASTM、ISO等组织每年新增…...
使用C#代码重新排列PDF页面的操作代码
引言对于页面顺序混乱的 PDF 文档,重新排列页面可以避免读者产生困惑,同时也能让文档结构更加清晰有序。本文将演示如何使用 Spire.PDF for .NET 以编程方式重新排列现有 PDF 文档中的页面。安装 Spire.PDF for .NET首先,需要将 Spire.PDF fo…...
C语言数组:从基础到实践
一、什么是数组数组就是相同类型数据的集合,这些数据在内存中连续存放,数组里的每个位置叫元素,用下标来访问。特别注意:数组的下标从0开始。以下代码就是一个简单的数组应用:二、数组的基本操作2.1 定义与初始化输出结…...
CSS Grid布局深入解析:掌握现代布局技术
CSS Grid布局深入解析:掌握现代布局技术 引言 CSS Grid布局是CSS3引入的强大布局系统,它提供了一种二维网格布局方式,可以轻松实现复杂的页面布局。本文将深入探讨Grid布局的核心概念、高级技巧和最佳实践。 一、Grid布局基础 1.1 Grid容器与…...
【应用实战】基于Dify与多Agent的凭证与档案管理
一、智能文档处理:基于Dify与多Agent的凭证与档案管理革新 在金融行业,文档处理贯穿业务始终。传统的纯人工方式不仅耗时费力,而且极易出错。智能文档处理(Intelligent Document Processing, IDP)融合了OCR、自然语言处…...
