数组全排列

规律
当n = 1时, 数组arr = [A],全排列结果为

[A];

当n = 2时, 数组arr = [A, B],全排列结果为

[A, B]
[B, A];

当n = 3时, 数组arr = [A, B, C],全排列结果为

[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, A, B]
[C, B, A]

到n = 3时可以看出全排列有以下规律

固定第一个元素,将剩下的元素进行全排列处理;
将第一个元素与依次与第i(1<i<=arr.length)个元素互换,将剩下的元素进行全排列处理;
结束
很适合使用递归解决。只要写一个全排列函数permutation,能固定一个下标为i的元素,剩下元素再进行全排列即可。

js实现
在ES5中使用闭包将全排列函数封装。

// 数组全排列
function Permutation(arr) {
    this.len = 0;    // 存储全排列次数
    this.arr = arr.concat();   // 传入的数组
    this.result = [];    // 存储全排列结果

    // 首次创建对象时初始化方法
    if (typeof Permutation.run == 'undefined') {
        Permutation.prototype.start = function() {
            this.run(0);
        }

        // 递归函数(核心方法),index为数组下标
        Permutation.prototype.run = function(index) {
            // 单遍历到数组末端时,将结果储存在result数组中,全排列次数加1
            if (index == this.arr.length - 1) {
                this.result.push(this.arr.slice());
                this.len++;
                return;
            }

            for(let i = index; i < this.arr.length; i++) {
                this.swap(this.arr, index, i);      // 与下标为i的元素交换位置
                this.run(index + 1);                // 剩下元素全排列
                this.swap(this.arr, index, i);      // 复原数组
            }
        }

        // 交换位置
        Permutation.prototype.swap = function(array, i, j) {
            var t;
            t = array[i];
            array[i] = array[j]; 
            array[j] = t;
        }
    }
}

var per = new Permutation([‘A’, ‘B’, ‘C’]);
per.start();
console.log(per.result);
console.log(per.len);
// [ [ ‘A’, ‘B’, ‘C’ ],
// [ ‘A’, ‘C’, ‘B’ ],
// [ ‘B’, ‘A’, ‘C’ ],
// [ ‘B’, ‘C’, ‘A’ ],
// [ ‘C’, ‘B’, ‘A’ ],
// [ ‘C’, ‘A’, ‘B’ ] ]
// 6
ES5代码使用动态原型模式创建对象,主要是想让函数封装的尽量像一个类。在ES6中有class,语法可以更加简洁高效。

// ES6

class Permutation {
    constructor(arr) {
        this.arr = Array.from(arr);
        this.result = [];
        this.len = 0;
        this.run(0);
    }

    run(index) {
        if (index == this.arr.length - 1) {
            this.result.push(Array.from(this.arr));
            this.len++;
            return;
        }
        for(let i = index; i < this.arr.length; i++) {
            [this.arr[index], this.arr[i]] = [this.arr[i], this.arr[index]];
            this.run(index + 1);
            [this.arr[index], this.arr[i]] = [this.arr[i], this.arr[index]];
        }
    }
  }

  let p = new Permutation(["A", "B", "C"]);
  console.log(p.result);
  console.log(p.len);
  // [ [ 'A', 'B', 'C' ],
  //   [ 'A', 'C', 'B' ],
  //   [ 'B', 'A', 'C' ],
  //   [ 'B', 'C', 'A' ],
  //   [ 'C', 'B', 'A' ],
  //   [ 'C', 'A', 'B' ] ]
  // 6

以上就是全排列的js实现。

要在C语言中实现数组全排列,可以使用递归方法。以下是两种不同的实现方法: 方法一: ```c #include <stdio.h> #include <stdlib.h> void swap(int arr[], int a, int b) { int temp = arr[a]; arr[a = arr[b]; arr[b = temp; } void perm(int a[], int begin, int n) { if (begin == n) { for (int i = 0; i <= n; i++) { printf("%d ", a[i]); } printf("\n"); } else { for (int k = begin; k <= n; k++) { swap(a, begin, k); perm(a, begin + 1, n); swap(a, begin, k); } } } int main() { int* a; int n; scanf("%d", &n); a = (int*)calloc(n, sizeof(int)); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } perm(a, 0, n - 1); free(a); return 0; } ``` 方法二: ```c #include <stdio.h> void Permutation(int m, int n, int arr[], int temp[]) { if (m >= n) { for (int i = 0; i < n-1; i++) { printf("%d ", arr[i]); } printf("%d\n", arr[n-1]); } else { for (int i = 0; i < n; i++) { if (temp[i == 0) { temp[i = 1; arr[m = i + 1; Permutation(m + 1, n, arr, temp); temp[i = 0; } } } } int main() { int arr = 0; } Permutation(0, n, arr, temp); return 0; } ``` 以上是两种C语言实现数组全排列的方法,你可以根据需要选择其中的一种方法来使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [排列组合之——全排列(c语言)](https://blog.csdn.net/m0_74820906/article/details/127779230)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C语言实现排列组合(全排列)](https://blog.csdn.net/weixin_45652695/article/details/104212424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值