一、字典序法

  1. 从序列P的右端开始向左扫描,直至找到第一个比其右边数字小的数字aia_iai​,即i=max{j∣aj<aj+1}i=max\{j|a_j <a_{j+1}\}i=max{j∣aj​<aj+1​}。

  2. 从aia_{i}ai​右边找出所有比aia_{i}ai​大的数中最小的数字aka_{k}ak​,即ak=min{aj∣aj>ai,j>i}a_{k}=min\{a_j|a_j >a_{i},j>i\}ak​=min{aj​∣aj​>ai​,j>i}。

  3. 交换aia_{i}ai​与aka_{k}ak​。

  4. 将右边的序列翻转,即可得到字典序的下一个排列。

  5. 重复上面的步骤,直至得到字典序最大的排列,即左边数字比右边的大的降序排列。

//字典序法
void dictionary(int length){int * data = (int *)malloc(sizeof(int) * length);int index;for (index = 0; index < length; ++index)data[index] = index + 1;FILE * fp = fopen("dictionary.txt", "w");print(fp, data, length);while (nextPermutation(data, 0, length)){print(fp, data, length);}fclose(fp);free(data);
}void swap(int data[], int i, int j){//交换两个元素char temp;temp = data[i];data[i] = data[j];data[j] = temp;
}void reverse(int data[], int first, int last){//翻转序列last--;while (first < last){swap(data, first++, last--);}
}int nextPermutation(int data[], int first, int last){int i, j;i = last - 2;while (i >= 0 && data[i] >= data[i+1])--i;if (i == -1){reverse(data, first, last);return 0;}j = last - 1;while (data[j] <= data[i]){--j;}swap(data, i, j);reverse(data, i + 1, last);return 1;
}void print(FILE * fp, int data[], int length){int index;for (index = 0; index < length; ++index){fprintf(fp, "%d ", data[index]);}fprintf(fp, "\n");
}

二、SJT Algorithm
初始状态为。

  1. 找到最大的可移动数m(当一个数指向一个比它小的数是,该数就是可移动数)

  2. 交换m和m所指向的数

  3. 改变所有比m大的数的方向

  4. 重复上面的步骤,直至找不到可移动数

//邻位对换法
void exchange(int length){Item * data = (Item *)malloc(sizeof(Item) * length);int index, indexOfMax;for (index = 0; index < length; ++index){data[index].digit = index + 1;data[index].direction = -1;data[index].mobile = (index != 0) ? 1 : 0;}indexOfMax = length - 1;FILE * fp = fopen("exchange.txt", "w");exPrint(data, length, fp);while (1== data[indexOfMax].mobile || existMobile(data, length)){if (1== data[indexOfMax].mobile){int direction = data[indexOfMax].direction;exSwap(data, indexOfMax, indexOfMax+direction);indexOfMax += direction;if ((indexOfMax == 0 && direction == -1) || (indexOfMax == length-1 && direction == 1)){toMobileorNot(data, length);}} else{index = findMax(data, length);if (index == -1)break;int direction = data[index].direction;exSwap(data, index, index + direction);index += direction;changeDirection(data, length, index);toMobileorNot(data, length);}exPrint(data, length, fp);}fclose(fp);free(data);
}int existMobile(Item data[], int length){//判断是否存在可移动数int index;for (index = 0; index < length; ++index){if (data[index].mobile == 1)return 1;}return 0;
}int findMax(Item data[], int length){//找到最大的可移动数int ans = -1;for (int index = 0; index < length; ++index){if (data[index].mobile == 1){if (ans == -1)ans = index;else if (data[index].digit > data[ans].digit)ans = index;}}return ans;
}void changeDirection(Item data[], int length, int index){//改变大于可移动数的数的方向for (int i = 0; i < length; ++i){if (data[i].digit > data[index].digit){data[i].direction = -data[i].direction;}}
}void toMobileorNot(Item data[], int length){if (data[0].direction == 1 && data[0].digit > data[1].digit)data[0].mobile = 1;elsedata[0].mobile = 0;for (int i = 1; i < (length - 1); ++i){int direction = data[i].direction;if (data[i].digit > data[i+direction].digit)data[i].mobile = 1;elsedata[i].mobile = 0;}if (data[length-1].direction == -1 && data[length-1].digit > data[length-2].digit)data[length-1].mobile = 1;elsedata[length-1].mobile = 0;
}void exPrint(Item data[], int length, FILE * fp){for (int index = 0; index < length; ++index){fprintf(fp, "%d ", data[index].digit);}fprintf(fp, "\n");
}void exSwap(Item data[], int i, int j){Item tmp = data[i];data[i] = data[j];data[j] = tmp;
}

三、Heap’s Algorithm

procedure generate(n : integer, A : array of any): if n = 1 then output(A) else for i := 1; i ≤ n; i += 1 do generate(n - 1, A) if n is odd then j ← 1 else j ← i swap(A[j], A[n])
#include <stdio.h>
#include <stdlib.h>
#include <time.h>FILE * fp = NULL;
int len;int str2int(char str[]){int i = 0;int result = 0;while (str[i] != '\0'){result = result * 10 + str[i] - '0';++i;}return result;
}void print(int data[]){int i;for (i = 0; i < len; ++i)fprintf(fp, "%d ", data[i]);fprintf(fp, "\n");
}void swap(int *x, int *y){int tmp = *x;*x = *y;*y = tmp;
}void generate(int data[], int n){int i;if (1 == n)print(data);//return;else{for (i = 0; i < n; ++i){generate(data, n-1);if (n % 2 == 1){swap(&data[1], &data[n-1]);} else{swap(&data[i], &data[n-1]);}}}
}void heapAlgorithm(int n){int * data = (int *)malloc(sizeof(int) * n);int i;for(i = 0; i < n; ++i)data[i] = i + 1;generate(data, n);free(data);
}
int main(int argc, char **argv){fp = fopen("heap.txt", "w");len = (argc > 1) ? str2int(argv[1]) : 10;clock_t time = clock();heapAlgorithm(len);time = clock() - time;printf("Heap's Algorithm takes %d clocks(%f seconds).\n", time, ((float)time)/CLOCKS_PER_SEC);return 0;
}

全排列算法(字典序法、SJT Algorithm 、Heap‘s Algorithm)相关推荐

  1. 全排列的生成算法:字典序法

    全排列的生成算法:字典序法    全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.     字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...

  2. python全排列字典序输出 递归_递归实现全排列,字典序法实现全排列

    问题:全排列的递归实现 编程思想: 用1 2 3为例,全排列结果为123,132,213,231,321,312  根据全排列的找到规律 1.将当前元素与后面位置的每个元素依此交换 2.交换后取后一个 ...

  3. 字典序全排列算法(非递归全排列算法)

    非递归全排列算法: 我们先看一个例子. 示例: 1 2 3的全排列如下: 1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1 我们这里是通过字典序法找出来的. ...

  4. 全排列邻位对换法c语言算法,全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法...

    1.引入原因:在此之前我们实现全排列本质上都是采用单向交换的思路,当交换到末端便要回溯至上一层面,如果我们采用双向的交换,便可以不断地交换下去,于是产生了邻位对换法.邻位对换法在找下一个排列的方法上在 ...

  5. 全排列的java算法_两种常用的全排列算法(java)

    问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...

  6. 【转】全排列算法非递归实现和递归实现

    来源:http://blog.csdn.net/e3399/article/details/7543861 (一)递归的全排列算法 (A.B.C.D)的全排列为 1.A后面跟(B.C.D)的全排列 2 ...

  7. php实现全排列,PHP全排列算法实现程序代码

    PHP全排列算法实现程序代码 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 简介 如1,2,3三个元素 ...

  8. 蓝桥杯——Java中的全排列算法

    蓝桥杯--Java中的全排列 全排列的概念 排列 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.不同的顺序是一个不同的排列.从n个元素中取m ...

  9. [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)

    我这里实现全排列的基本算法如下(C++): 1 #include <algorithm> 2 #include <iostream> 3 #include <vector ...

  10. Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示

    Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 目录 一.数据结构算法 1.顺序表 2.链表 3.栈和队列 4.串的模式匹配 5.稀疏矩阵 6.广义表 7.二叉树 8 ...

最新文章

  1. 神经网络AI加速器技术
  2. python项目2019_2019 年 11 月精选 GitHub 上 几个牛逼 Python 的项目
  3. .NET西安社区 [拥抱开源,又见 .NET] 活动简报
  4. 电脑老是提示虚拟内存不足的原因及解决办法
  5. [obc学习日记]3.10
  6. nginx静态文件服务器_Linux分享文件?快速创建静态文件服务器
  7. Anomaly Detection异常检测基础
  8. 家里的所有网线都集中到了弱电箱怎么组网?
  9. 标准时间标准Time Zone: GMT,UTC,DST,CST
  10. python Numpy中的array函数讲解及各参数含义
  11. 制作u盘winpe启动盘_u盘启动盘制作工具教程
  12. java sqlite sqlite_busy_sqlite3出现SQLITE_BUSY错误码的原因以及解决方法
  13. Unrecognized Windows Sockets error: 10106的解决办法
  14. 申请CSDN博客专家认证成功
  15. 网页编程语言,网页编程语言大全介绍。
  16. [RK3288][Android6.0] 调试笔记 --- 系统第一次开机进入Recovery模式原因
  17. 《刷新》读书笔记2-看萨提亚治下的微软文化变革
  18. TextView中英文排版混乱
  19. 程序猿共勉:小富即安真要不得
  20. 新功能上线 | “性能怪兽”Amazon Graviton2 正式登陆亚马逊云科技中国区域!

热门文章

  1. 淘宝双11大数据分析(数据可视化)
  2. 【加速 PyTorch 模型训练的 9 个技巧】
  3. 蓝湖能导入html文件么,axure怎么导入蓝湖
  4. 趁你年轻快来学学如何搭建一个小说网站,这里有超详细教程,快进来看看吧,错过了可不要后悔哟。
  5. python入门部分基础知识(下)
  6. 服务器机箱销售跑哪些地方,网购主机老出问题?其实你早已上当受骗,这些猫腻很多人都不知道...
  7. c++/c语言(高质量程序设计指南林锐建议总结)
  8. 如何做外链成为有效外链之做有效问答外链
  9. nodejs项目(基于Express)——为上传的图片贴上国旗图标(使用gm)并返回图片位置
  10. vijos- P1385盗窃-月之眼 (水题 + python)