zoukankan      html  css  js  c++  java
  • 全排列的非递归算法

     1 #include <iostream>
    2 #include <cstdio>
    3 using namespace std;
    4
    5 #define NumOfElem(a) (sizeof(a)/sizeof(a[0]))
    6
    7 void Swap(int * a, int m, int n)
    8 {
    9 int temp = a[m];
    10 a[m] = a[n];
    11 a[n] = temp;
    12 }
    13
    14 void Input(int *a, int n)
    15 {
    16 int i = 0;
    17 for (i = 0; i < n; ++i) {
    18 a[i] = i;
    19 }
    20 }
    21
    22 void Output(int *a, int n)
    23 {
    24 int i = 0;
    25 for (i = 0; i < n; ++i) {
    26 printf("%4d", a[i]);
    27 }
    28 printf("\n");
    29 }
    30
    31 int Cmp(const void * data1, const void * data2)
    32 {
    33 int n1, n2;
    34 n1 = *(int *)data1;
    35 n2 = *(int *)data2;
    36 if (n1 < n2)
    37 return -1;
    38 if (n1 == n2)
    39 return 0;
    40 return 1;
    41 }
    42
    43 int mycount = 1;
    44
    45 bool NextPerm(int * a, int n) // 字典顺序的下一个
    46 {
    47 int i, j;
    48 int flag = false;
    49 for (i = n - 1; i >= 0; --i) {
    50 for (j = n - 1; j >= i; --j) {
    51 if (a[j] > a[i]) {
    52 flag = true;
    53 Swap(a, i, j);
    54 // printf("%d\t%d\n", i, j);
    55 break;
    56 }
    57 }
    58 if (flag)
    59 break;
    60 }
    61 if (flag) {
    62 qsort(a+i+1, n - i - 1, sizeof(int), Cmp);
    63 ++mycount;
    64 return true;
    65
    66 }
    67 return false;
    68 }
    69
    70 #define N 5
    71 int main()
    72 {
    73 int a[N];
    74 Input(a, N);
    75 // int a[N] = {0, 1, 3, 4, 2};
    76 Output(a, N);
    77 while (NextPerm(a, N)) {
    78 Output(a, N);
    79 }
    80 cout << mycount << endl;
    81
    82 return 0;
    83 }

    从后往前找到第一个逆序i, j (pi < pj),这里的第一个是指前面的那个下标i。

    此时交换i,j。并给i后面的元素排序,也就是完全升序,即可。

  • 相关阅读:
    简单复利计算java板
    弹出提示框的方式——java
    实验一 命令解释程序
    简单复利计算c语言实现
    操作系统
    jsp 页面和 jsp标记
    对it行业的一些看法
    又穷自动机的构造
    复利计算——结对编程2.0
    汉堡包
  • 原文地址:https://www.cnblogs.com/tzhangofseu/p/2203063.html
Copyright © 2011-2022 走看看