题目:
首先输入一个数字n,连续输入n个不同的整数,输出所有能排列的可能。
整体思路
我们将需要的数写进数组中,写一个函数进行排序,数组的下标从0开始,n-1结尾,将数组下标进行传参。
代码如下:
int main() { int arr[1000]; int n = 0; printf("请输入数字个数:"); scanf("%d", &n); printf("请输入%d个数字:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("所有排列如下:\n"); permut(arr, 0, n-1); return 0; }
函数接收如下
1. void permut(int* arr,int p, int q) 2. { 3. 4. }
排序函数的实现
那我们要如何实现这个函数?
让我们先看一个简单的例子,有三个数1,2,3,他们的所有排列可能如下:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
总计6种
我们可以将他们看成三组,分别是以1,2,3开头的,后面两个数做所有的排列方式,我们简称全排列,
那我们不妨发散一下,如果有更多数呢?比如1,2,3,4,5,6
分别以1,2,3,4,5,6开头,剩下的数进行全排列。
那我们如何找到这六个数并放到最前面来呢?
我们可以写一个循环,让第一个数也就是下标为0,依次与后面的数进行交换,这里写一个交换函数swap。
void permut(int* arr,int p, int q) { int i=0; for (i = p;i <= q;i++) { swap(&arr[p], &arr[i]); } }
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; }
在交换完之后,剩下的数再做全排列,进入下一层递归,第一层是下标p到q,下一层则是p+1到q。
void permut(int* arr, int p, int q) { int i=0; for (i = p;i <= q;i++) { swap(&arr[p], &arr[i]); permut(arr, p+1, q); } }
在下标为p+1到q完成全排列之后,需要把第二个数提到最前面来,那自然需要把排列结果恢复上一次调换之前的情况,再返回上一层递归:
void permut(int* arr, int p, int q) { int i=0; for (i = p;i <= q;i++) { swap(&arr[p], &arr[i]); permut(arr, p+1, q); } }
但这个递归要怎么停止呢?
当只有一个数字做全排列的时候,他的全排列等于他本身,递归也就停止,即p==q,这个时候可以把排列打印出来了,写一个打印函数。
void permut(int* arr, int p, int q) { int i = 0; if (p == q) { print(arr, q); } else { for (i = p;i <= q;i++) { swap(&arr[p], &arr[i]); permut(arr, p + 1, q); swap(&arr[i], &arr[p]); } } }
void print(int* arr, int n) { int i=0; for (i = 0;i <= n;i++) { printf("%d ",arr[i]); } }
完整代码
#include<stdio.h> void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void print(int* arr, int n) { int i=0; for (i = 0;i <= n;i++) { printf("%d ",arr[i]); } } void permut(int* arr, int p, int q) { int i = 0; if (p == q) { print(arr, q); } else { for (i = p;i <= q;i++) { swap(&arr[p], &arr[i]); permut(arr, p + 1, q); swap(&arr[i], &arr[p]); } } } int main() { int arr[1000]; int n = 0; printf("请输入数字个数:"); scanf("%d", &n); printf("请输入%d个数字:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("所有排列如下:\n"); permut(arr, 0, n - 1); return 0; }