當前位置:首頁 » 編程語言 » 用c語言實現數組全排列
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

用c語言實現數組全排列

發布時間: 2022-05-20 20:16:57

『壹』 c語言。。。把一個數組里的數字(均為一位)全排列,(例如1,2,3全

#include<stdio.h>

intdata[]={1,2,3,4};
intn=sizeof(data)/sizeof(data[0]);
intused[20];
intprint()
{
inti,j;
for(i=1;i<=n;i++)
{
for(j=0;j<n;j++)
{
if(used[j]==i)printf("%d",data[j]);
}
}
printf(" ");
}
intdfs(intp)
{
if(p>n)
{
print();
return0;
}
inti=0;
for(i=0;i<n;i++)
{
if(!used[i])
{
used[i]=p;
dfs(p+1);
used[i]=0;
}
}
}
intmain()
{
dfs(1);
}

『貳』 在C語言中,如何輸出一組數的排列組合

#include <stdio.h>

#include <stdlib.h>

int n = 0;

void swap(int *a, int *b)

{

int m;

m = *a;

*a = *b;

*b = m;

}

void perm(int list[], int k, int m)

{

int i;

if(k > m)

{

for(i = 0; i <= m; i++)

printf("%d ", list[i]);

printf(" ");

n++;

}

else

{

for(i = k; i <= m; i++)

{

swap(&list[k], &list[i]);

perm(list, k + 1, m);

swap(&list[k], &list[i]);

}

}

}

int main()

{

int k;//輸入自然數的個數

printf("請輸入連續自然數的個數:");

scanf("%d",&k);

int *list = (int *)malloc(k);

for (int i = 0; i < k; i ++)

{

list[i] = i + 1;

}

// int list[] = {1, 2, 3, 4, 5};

perm(list, 0, k-1);

printf("total:%d ", n);

return 0;

}

該程序的輸入為一個任意自然數n,將輸出從1到n的全排列。

(2)用c語言實現數組全排列擴展閱讀:

C語言的基本數的排列法

1、冒泡排序:每次相鄰兩個數比較,若升序,則將大的數放到後面,一次循環過後,就會將最大的數放在最後。

#include <stdio.h>

int main(void)

{

int a[1001];

int n,i,j,t;

scanf("%d",&n);//n為要排序的數的個數

//輸入要排序的數

for(i=0;i<n;++i)

scanf("%d",a+i);

//接下來進行排序

for(i=0;i<n-1;++i)//n個數,總共需要進行n-1次

{ //n-1個數排完,第一個數一定已經歸位

//每次會將最大(升序)或最小(降序)放到最後面

for(j=0;j<n-i-1;++j)

{

if(a[j]>a[j+1])//每次冒泡,進行交換

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

for(j=0;j<n;++j)

printf("%-5d ",a[j]);

printf(" ");

}

return 0;

}

2、選擇排序:從第一個數開始,每次和後面剩餘的數進行比較,若升序,則如果後邊的數比當前數字小,進行交換,和後面的所有的數比較、交換後,就會將當前的最小值放在當前的位置。

#include <stdio.h>

int main(void)

{

int a[1001];

int n,i,j,t;

scanf("%d",&n);//n為要排序的數的個數

//輸入需要排序的數

for(i=0;i<n;++i)

scanf("%d",a+i);

//接下來進行排序

for(i=0;i<n-1;++i)//因為每次需要和a[i]後面的數進行比較,所以到a[n-2](倒數第2個元素)就行

{

for(j=i+1;j<n;++j)//j從i後一個開始,a[i]與a[j]進行比較

{

if(a[i]>a[j])//a[i]為當前值,若是比後面的a[j]大,進行交換

{

t=a[i];

a[i]=a[j];

a[j]=t;

}

}//每排序一次,就會將a[i](包括a[i])之後的最小值放在a[i]的位置

for(j=0;j<n;++j)

printf("%-5d",a[j]);

printf(" ");

}

return 0;

}

『叄』 c語言求全排列

用迭代演算法簡單些, 就是速度慢許.

演算法為:
為求1 ~ n個整數的函數 permutation,
* 如果n = 2, 只有兩種排列方式, 即 (1, 2) (2, 1)
* 迭代計算1 ~ n-1個整數的全排列
* 將n插入所得到的1 ~ n-1的全排列的任意位置得到1 ~ n的全排列.

『肆』 全排列用C語言實現

給,已經編譯運行確認:
#include<stdio.h>
#include<string.h>
char a[20];
int lenth;
long count=0;
void main()
{void move(int,int);
int i,j=0;
printf("input:");gets(a);
lenth=strlen(a);
for(i=0;i<lenth;i++)
move(j,i);//move a[i] to the front of a[j];
printf("\ntotal=%d\n",count);
}
void move(int here,int which)//move a[which] to the front of a[here];
{char b[20];
char temp;
int m,n;
if(here<lenth-1)
{if(here!=which)
{for(m=0;m<lenth;m++)
b[m]=a[m];
temp=a[which];
for(m=which;m>here;m--)
a[m]=a[m-1];
a[m]=temp;
}
for(n=here+1;n<lenth;n++)
move(here+1,n);
if(here!=which)
for(m=0;m<lenth;m++)
a[m]=b[m];
}
else
{printf("%-10s",a);
count++;}
}

『伍』 c語言全排列

這個說起來太麻煩了, 我找了一個, 你看看行不, 不可以的話, 私聊吧.
全排列用的是 置換演算法,
演算法這東西重在理解。具體代碼並不那麼重要。

全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n!個。現以{1, 2, 3, 4, 5}為

例說明如何編寫全排列的遞歸演算法。

1、首先看最後兩個數4, 5。 它們的全排列為4 5和5 4, 即以4開頭的5的全排列和以5開頭的4的全排列。

由於一個數的全排列就是其本身,從而得到以上結果。

2、再看後三個數3, 4, 5。它們的全排列為3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六組數。

即以3開頭的和4,5的全排列的組合、以4開頭的和3,5的全排列的組合和以5開頭的和3,4的全排列的組合.

從而可以推斷,設一組數p = {r1, r2, r3, ... ,rn}, 全排列為perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。當n = 1時perm(p} = r1。

為了更容易理解,將整組數中的所有的數分別與第一個數交換,這樣就總是在處理後n-1個數的全排列。

演算法如下:

#include <stdio.h>

int n = 0;

void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}
鏈接: http://..com/question/71586341.html?si=2

『陸』 C語言 全排列······暈

首先,我下面的敘述是建立在樓主明白什麼是遞歸調用的基礎上的。對遞歸毫無了解的話,請先看看網路。
然後,進入正題。

第一個return:就是返回這個函數的調用者,這個函數執行完畢。這是一個if判斷,當帶排列的數列長度為1時,只有一種可能,輸出,則排列結束,返回。長度不只1的時候,執行以下for。

未完待續

接著講這個
for(i=0;i<n;i++){----------這個循環到底怎麼個看法和順序?
anagram(d,n-1); 怎麼輸出的??(這塊都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];

}
d[n-1]=temp;

}

先講這個演算法的思想,比如對abc進行全排列,那麼可以看做:ab的全排列+c和ac的全排列+b和bc的全排列+a三個的組合。然後再細化,ab的全排列可以看出a的全排列+b,和b的全排列+a兩個的組合。當只有一個時,就是調用if=1的那個情況,直接print。不是1的時候,就是遞歸調用,進行不斷地分解。

這是演算法思想,未完待續

兩個for循環,裡面的for執行一邊後就是把數組的元素挨個往前挪一位,第一位到最後位,然後對前n-1位進行全排列,遞歸進行。從上面的演算法思想中我們可以看出這樣的目的和意義,就是一個類似對上面abc的分解過程,一次a到最後排bc,一次b到最後排ac,一次c到最後排ab。

就先說這么多吧。純手打,望採納!有問題可以補充,或者網路hi我。

我幫你改了一下代碼,加了幾行printf,希望可以解決你的那幾個問題:

#include<stdio.h>
#define NUM 3
void anagram(int[],int);
void print(int[]);
void main()
{
int d[NUM];
int i;
for(i=0;i<NUM;i++)
d[i]=i + 1;
printf("初始化後的數組順序是:");
print(d);

anagram(d,NUM);
}
void anagram(int d[],int n)
{
int i,j,temp;
int p;
if(n==1){
print(d); //列印函數
return;//-------------return返回哪?
} // 和下面的for怎麼聯系起來?

for(i=0;i<n;i++){//----------這個循環到底怎麼個看法和順序?
printf("\ni = %d,n = %d, 准備調用aragram(d,%d)\n",i,n,n-1);
printf("這時候的數組順序是:");
print(d);
anagram(d,n-1); // 怎麼輸出的??(這塊都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];

}
d[n-1]=temp;

}
}
void print(int d[]){
int i;

for(i=0;i<NUM;i++){
printf("%d",d[i]);
}

printf("\n");

}

PS:
改動:1、print函數原來是逆序輸出,改成正序輸出,有利於理解;2、數組原來初始化為321,改為123,有利於理解。就改了這兩個地方,加了一些printf。

你可以運行一下。

輸出結果:
初始化後的數組順序是:123

i = 0,n = 3, 准備調用aragram(d,2)
這時候的數組順序是:123

i = 0,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:123
123

i = 1,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:213
213

i = 1,n = 3, 准備調用aragram(d,2)
這時候的數組順序是:231

i = 0,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:231
231

i = 1,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:321
321

i = 2,n = 3, 准備調用aragram(d,2)
這時候的數組順序是:312

i = 0,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:312
312

i = 1,n = 2, 准備調用aragram(d,1)
這時候的數組順序是:132
132
請按任意鍵繼續. . .

『柒』 C語言(不是C#)實現 數字全排列(會盡快結帖)

#include <stdio.h>
#include <stdlib.h>

inline void Swap(int* lhs, int* rhs)
{
int tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}

void Reverse(int* beg, int* end)
{
while(beg < end)
Swap(beg++, --end);
}

void Print(int* beg, int* end)
{
while(beg != end)
printf("%d ", *beg++);
putchar('\n');
}

inline int Cmp(const void* lhs, const void* rhs)
{
return *(const int*)rhs - *(const int*)lhs;
}

void Permutation(int* beg, int* mid, int* end)
{
if(end- mid > 1)
qsort(mid, end - mid, sizeof(int), Cmp);
int* nav = end - 1;
Print(beg, mid);

for(;;)
{
int* tmp = nav;
if(*--nav < *tmp)
{
int* rmbt = end;
while(*--rmbt <= *nav);
Swap(nav, rmbt);
if(tmp <= mid)
{
Reverse(tmp, end);
if(end - mid > 1)
qsort(mid, end - mid, sizeof(int), Cmp);
}
Print(beg, mid);
nav = end - 1;
}
if(nav == beg)
{
Reverse(beg, mid);
break;
}
}
}

int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int m, n;

printf("Select n numbers\b\b\b\b\b\b\b\b\b");
scanf("%d", &n);
printf("from m numbers\b\b\b\b\b\b\b\b\b");
scanf("%d", &m);

Permutation(a, a + n, a + m);
}

Select 3 numbers
from 3 numbers
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Select 2 numbers
from 3 numbers
1 2
1 3
2 1
2 3
3 1
3 2

『捌』 對數據長度為n的數組內的數據進行全排列,c語言

#include<stdio.h>
#include<math.h>
int ans[15];
int a[15],n;
int used[15]={0};
void DFS(int deep)
{
int i;
if(deep==n)
{
for(i=0;i<n;i++)
{
printf("%d ",ans[i]);
}
puts("");
return ;
}
for(i=0;i<n;i++)
{
if(used[i])continue;
used[i]=1;
ans[deep]=a[i];
DFS(deep+1);
used[i]=0;
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&a[i]);
DFS(0);
return 0;
}

『玖』 0 1 2 3 全排列 用C語言怎麼編寫 (用數組),詳細點,謝謝

//0123全排列

#include<stdio.h>

#include<conio.h>

intmain()

{

inti,j,k,l;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

for(k=0;k<4;k++)

for(l=0;l<4;l++)

printf("%d%d%d%d",i,j,k,l);

getch();

getch();

}

程序運行結果

還有,全排列就是把全部的可能寫出來嗎?

-物聯網校企聯盟技術部

『拾』 編寫C語言程序,把一個數組按從小到大的次序排列起來

源程序以及演算法注釋如下:

#define _CRT_SECURE_NO_WARNINGS//VS編譯環境需要進行宏定義,VC6.0可忽略

#include<stdio.h>//輸入輸出頭文件

int main()

{

int number[10], New_number[10];//定義數組的數據類型為整型

int i, j, m, n, k;//定義變數的數據類型為整型

printf("input 10 <int> number:");//文字提示

for (i = 0; i <= 9; i++)//用循環輸入數值給數組number並賦給數組New_number

{

scanf("%d", &number[i]);//輸入10個整形數字到數組中

New_number[i] = number[i];//數組number元素賦給數組New_number

}

for (n = 0; n <= 8; n++)//要進行(10-1)組比較

for (j = 0; j <= 8 - n; j++)//每組進行(10減第幾組)次比較

{

if (number[j] > number[j + 1])//比較大小並將小的賦給前面的數組

{

k = number[j];//將相對較大的元素賦值給中間元素

number[j] = number[j + 1];//將相對較小的元素送達前面一個位置

number[j + 1] = k;//將中間變數元素送給後面一個位置

}

if (New_number[j] < New_number[j + 1])//比較大小並將大的賦給前面的數組

{

k = New_number[j + 1];//將相對較小的元素賦值給中間元素

New_number[j + 1] = New_number[j];//將相對較大的元素送達前面一個位置

New_number[j] = k;//將中間變數元素送給後面一個位置

}

}

printf("min-->max: ");//文字提示

for (m = 0; m <= 9; m++)//依次從小到大輸出

printf("%d ", number[m]);//輸出元素

printf(" ");

printf("max-->min: ");//文字提示

for (m = 0; m <= 9; m++)//依次從大到小輸出

printf("%d ", New_number[m]);//輸出元素

printf(" ");

return 0;

}

程序運行結果如下:



(10)用c語言實現數組全排列擴展閱讀:

其他簡單實現程序:

#include<stdio.h>

int main()

{

int a[10]={0};

int i,j,temp;

for(i = 0;i<10;i++)

{

scanf("%d",&a[i]);

}

for(i = 0;i<10;i++)

{

for(j = 0;j<10-i-1;j++)

{

if(a[j]>a[j+1])

{

temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}

for(i = 0;i<10;i++)

printf("%d ",a[i]);

return 0;

}