全排列之字典序法

2014-02-08 13:36:09 · 作者: · 浏览: 95

  (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;

  }