国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一個比較好的全排列算法(C語言)

2019-09-10 09:07:14
字體:
來源:轉載
供稿:網友

 

全排列算法

我有一個比較好的全排列算法,我驗證了3、4、5的結果是正確的。

程序中沒有使用遞歸,只是幾個循環,速度還令人滿意。
在C466A,Win2000的機器上,進行8個數字的全排列,結果不顯示,重定向到一個文本文件中,耗時不到一秒鐘

。9個數字的全排列耗時6秒種。10個數字的全排列55秒種。(以上都不顯示結果,均重定向到一個文本文件)

11個數字的全排列(不顯示結果,在原程序中不定義ISPRINT)耗時大約16秒鐘。

歡迎各位指點

算法為:用兩個數組,一個數組存放當前結果,第二個數組是每一個數是否已經使用的標志。比如對10個數進

行全排列,第一個結果是:0 1 2 3 4 5 6 7 8 9。
然后把每一個數的使用標志均置為1。
然后開始主循環:
   先打印當前的結果。
   在前一個得到的結果中,從后往前找第一個由小到大排列的數。每找一次均置當前位上的數字的使用標志

為0,然后找第一個比這個數大但是沒有使用過的數。
比如前一個結果是:4 1 9 7 8 2 5 0 6 3,那么從后往前第一個由小到大排列的數是0,第一個比0大但是沒有

使用過的數是3(因為比0大的數字里只有6和3)。最后由小到大依次打印剩余沒有使用過的數字。所以下一個

結果是4 1 9 7 8 2 5 3 0 6。

源程序為(在BC++3.0下編譯成功):


#include<stdio.h>/*這兩個庫函數是習慣性的加上去的^_^。*/
#include<stdlib.h>

#define ISPRINT/*是否打印結果的標志*/
#define MAX 200/*最大的數*/

unsigned int *_NUM;/*用于存放一條結果的數組指針*/
char *_NUMFLAG;/*用于存放是否已經使用的標志*/

#define NUM(j) (*(_NUM+(j)))/*第j位的數字*/
#define NUMFLAG(j) (*(_NUMFLAG+(j)))/*數字j是否已經使用的標志,0為沒有使用,1為已經使用*/
#define NUMUSE(j) (*(_NUMFLAG+(*(_NUM+(j)))))/*第j位上的數字是否已經使用的標志,0為沒有使用,1為已

經使用*/

void main()
{
unsigned int number,j;
int i;
printf("Input number=");scanf("%u",&number);
if((number>=MAX)||(number<=1)){puts("輸入數據錯誤。");exit(-1);}

/*初始化內存和第一個結果*/
_NUM=(unsigned int*)malloc(sizeof(unsigned int)*number);
if(!_NUM){puts("分配給_NUM出現內存不足");exit(-1);}
_NUMFLAG=(char*)malloc(sizeof(char)*number);
if(!_NUMFLAG){puts("分配給_NUMFLAG出現內存不足");exit(-1);}

for(i=0;i<number;i++)NUM(i)=i,NUMFLAG(i)=1;/*初始化第一條結果和使用標志*/

do{/*主循環*/
 
 #ifdef ISPRINT/*打印結果*/
 for(j=0;j<number;j++)printf("%d ",NUM(j));/*打印一條結果。*/
 puts("");/*并換行*/
 #endif  

 NUMUSE(number-1)=0;//置最后一位數字的使用標志為0.

 /*在前一個結果中從后往前尋找第一個從小到大排列的數,并存放到變量j中*/
 for(i=number-2;i>=0;i--){
  NUMUSE(i)=0;
  if(NUM(i)<NUM(i+1))break;
 }

 if(i<0)break;/*從這里退出主循環.*/

 for(j=NUM(i)+1;j<number;j++){
  if(!NUMFLAG(j))break;
 }

 NUMFLAG(j)=1;
 NUM(i)=j;

 for(j=0,i++;i<number;j++)
  if(!NUMFLAG(j))NUM(i++)=j,NUMFLAG(j)=1;
}while(1);
/*釋放內存*/
free(_NUM);
free(_NUMFLAG);
}

 

/*程序結束*/

當然了這個程序的速度并不是最快的,程序中還有很大的優化余地,還可以減少一些循環,或者采用其他更好的算法。

下載源程序http://263.csdn.net/FileBBS/files/2001_8/T_387_1.zip

 

上一篇:Foo 的辭源

下一篇:Effective C++ 2e Item43

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 本溪市| 平武县| 浏阳市| 新巴尔虎右旗| 晋城| 永宁县| 广南县| 清远市| 中卫市| 阜宁县| 化隆| 疏附县| 宜昌市| 高台县| 彝良县| 丹阳市| 云梦县| 雅江县| 广元市| 车险| 陆丰市| 太湖县| 云林县| 莒南县| 皮山县| 西充县| 徐水县| 武汉市| 临朐县| 宁明县| 鹤庆县| 井研县| 甘谷县| 长顺县| 平江县| 利川市| 黄大仙区| 成武县| 海伦市| 阳江市| 阳江市|