设为首页 加入收藏

TOP

全排列之字典序法
2014-02-08 13:36:09 来源: 作者: 【 】 浏览:94
Tags:排列 字典

  (1) 对于输入的字典序排列,反向查找第一对满足a[j] (2) 仍旧反向查找第一个下标k,使得 a[j] (3) 交换a[j]和a[k]

  (4) 翻转a[j+1]~a[end]

  此法能适应有重复元素的系列

  代码如下:

  #include <IOSTREAM>

  #include <CSTDLIB>

  using namespace std;

  int cmp(const void* a, const void* b){

  return *(int*)a - *(int*)b;

  }

  inline void println(int arr[], int len){

  for(int i = 0; i < len; i++){

  cout 《 arr[i] 《 " ";

  }

  cout 《 endl;

  }

  inline void reverse(int arr[], int left, int right){

  while(right >= left){

  swap(arr[left++], arr[right--]);

  }

  }

  void full_permutation(int arr[], int len){

  qsort(arr, len, sizeof(int), cmp);

  println(arr, len);

  while(true){

  int j = len-1;

  int t = len;

  while(j >= 0 && arr[--j] >= arr[j+1]) ;

  if(j >= 0){

  while(arr[--t] <= arr[j]) ;

  swap(arr[t], arr[j]);

  reverse(arr, j+1, len-1);

  println(arr, len);

  }

  else{

  break;

  }

  }

  }

  int main(int argc, char* argv)

  {

  int testArr[] = {23, 43, 8, 8};

  int len = sizeof(testArr)/sizeof(int);

  full_permutation(testArr, len);

  return 0;

  }

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇组合之01转换法 下一篇c/c++常用算法-- 基本排序算..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)