第一种:

这是普通的实现:**

#include<iostream>
#include<time.h>
#include<algorithm>
using namespace std;//交换
void swap(int arr[],int i , int j)
{int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;} void Perm(int list[] , int k ,int m)
{//list 数组存放排列的数,k表示层 代表第几个数,m表示数组的长度if(k==m){//K==m 表示到达最后一个数,不能再交换,最终的排列的数需要输出;//for(int i=0 ;i<=m ;i++)// cout<<list[i];//cout<<endl; return ;} else{for(int i=k;i<=m;i++){swap(list, i, k);Perm(list,k+1,m);swap(list, i, k);}}
}
int main(void)
{clock_t t1 = clock();int a[10];for(int i = 0; i < 10; i ++) {a[i] = i;}int n = sizeof a/sizeof a[0]; Perm(a, 0, n); cout <<"time is "<< (clock() - t1) * 1.0 / CLOCKS_PER_SEC * 1000 << endl;return 0;
}

这种实现的时间复杂度为O(n*n!)
上面程序在我电脑上运行时间是:(单位秒)
10个数的全排列:

11个数的全排列:


第二种:

#include<iostream>
#include<time.h>
#include<algorithm> using namespace std; //交换
void swap(int arr[],int i , int j)
{int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;
} //打印
void printArr(int a[],int n)
{ for (int i=0; i<n; i++) cout << a[i] << " "; printf("\n");
} void heapPermutation(int a[], int size, int n)
{  if (size == 1) { //printArr(a, n); return; } for (int i=0; i<size; i++) { heapPermutation(a,size-1,n); if (size%2==1) //奇数swap(a,0,size-1); else   //偶数swap(a,i,size-1); }
} int main()
{ clock_t t1 = clock();int a[11];for(int i = 0; i < 11; i ++) {a[i] = i;}int n = sizeof a/sizeof a[0]; heapPermutation(a, n, n); cout <<"time is "<< (clock() - t1) * 1.0 / CLOCKS_PER_SEC * 1000 << endl;return 0;
}

这个的时间复杂度可能是O(n!)(我猜的)
10个数的全排列:

11个数的全排列

12个数的时候:


这个算法的描述:
见维基百科:
https://en.wikipedia.org/wiki/Heap%27s_algorithm#cite_note-3
截了些图想看就看吧,我是不想看了,会用就好(哈哈)


非递归伪代码:

非递归实现:

void heapPermutation2(int arr[],int n)
{int c[n];for(int i = 0; i < n; i++){c[i] = 0;}//printArr(arr,n);int i = 0;while(i < n){if(c[i] < i){if(i%2 == 0){swap(arr,0,i);}else{swap(arr,c[i], i);}// printArr(arr,n);c[i]++;i = 0;}else {c[i] = 0;i++;}}
}





小优化:

void heapPermutation(int a[], int size, int n)
{  if (size == 1) { //printArr(a, n); return; } for (int i=0; i<size; i++) { heapPermutation(a,size-1,n); if(i < size-1){if (size%2==1)     swap(a,0,size-1); elseswap(a,i,size-1);} }
}

总结:虽然快了很多,但是很慢,13左右就要运行很久了。


高效点的全排列算法---堆算法(跟堆排序没关系)相关推荐

  1. 数据结构与算法——堆的原理和实现

    目录 一.堆的原理 二.堆的实现 1.堆的定义 2.堆的初始化 3.向上调整算法 4.向上调整算法代码实现 5.堆的插入 6.向下调整算法 6.堆的删除 7.堆的大小 8.判断堆是否为空 总结 一.堆 ...

  2. 数据结构与算法---堆的基本操作

    堆的定义 堆可以看做是一种特殊的树,堆结构满足两个条件: 1.堆是一个完全二叉树. 2.堆的每一个节点的值都大于等于(或小于等于)其子节点的值. 大于等于子节点的值我们叫它:大顶堆 小于等于子节点的值 ...

  3. 获取序列全排列Java,java中全排列的生成算法汇总

    全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...

  4. USACO07DEC道路建设Building Roads(prim算法+堆优化与Kruskal+路径压缩对比)

    目录 primprimprim算法 KruskalKruskalKruskal算法 P2872 [USACO07DEC]道路建设Building Roads 4 1 1 1 3 1 2 3 4 3 1 ...

  5. 更高效的PacBio长read纠错算法的研究

    更高效的PacBio长read纠错算法的研究 更高效的PacBio长read纠错算法的研究 中文摘要 第三代PacBio测序技术的长read已越来越广泛的应用于各类测序项目中,而降低其约15%的错误率 ...

  6. 如何高效准备2021届秋招算法岗面试?

    作为一名程序员,你肯定想过:编程最本质的知识是什么?很多人都会说是算法与数据结构.为什么是算法?算法如何帮助程序员升级打怪?进大厂.升职加薪.找到女朋友..... 1 算法是去国内一线互联网公司的必要 ...

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

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

  8. 数据结构与算法 | 堆

    二叉树的顺序结构 堆的概念及结构 堆的实现 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费.而完全二叉树更适合使用顺序结构存储.现实中我们通常把堆(一种二叉树)使用 ...

  9. 在FAANG面试中破解堆算法

    In FAANG company interview, Candidates always come across heap problems. There is one question they ...

最新文章

  1. 将Eclipse中Web项目打成war包
  2. LoadRunner监控Linux
  3. 第三十四课.模糊神经网络
  4. 6425C-Lab6 实现组策略
  5. is属性用法 vue_vue组件讲解(is属性的用法)模板标签替换操作
  6. 购买腾讯云主机后的快速配置
  7. MySQL5.7 常用系统表大全
  8. yarn的配置 -- 无法将“yo”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  9. python人门指南小说-致Python初学者 Anaconda入门使用指南完整版
  10. kubernetes 查看日志方法
  11. [转]gluPerspective函数
  12. 腾讯云播放器 Demo与调用方法
  13. brctl 使用说明
  14. 看各路单词APP不顺手 索性自己写一个背单词系统
  15. Interview with Dustin Kirkland, Ubuntu Core Developer about encryption in Ubuntu
  16. tmall.item.add.simpleschema.get( 天猫发布商品规则获取 )
  17. Python几种常用的数据导入方法
  18. 后台管理系统日志(一个小插曲)
  19. 煮熟的鸡蛋这么用竟可治病
  20. c语言 单词首字母大写

热门文章

  1. 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴
  2. python与office结合可以干什么-python与office(一)
  3. python自动化办公模块有哪些-Python自动化办公知识点整理汇总
  4. python代码翻译器-利用Python制作一款简单的翻译软件
  5. 离线语音控制并不等于本地语音识别
  6. 未来比较火的计算机领域,【火了】未来十年,中国人才最紧缺的6个专业!
  7. Promise的简单使用例子
  8. 【计算机网络笔记】交换方式:电路/分组/报文交换
  9. x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1
  10. html页面显示动态日期时间,如何在网页中动态显示当前日期和时间(js调用)