c語言實現排列
Ⅰ c語言:編寫一個程序用冒泡排序實現升序排列
1、首先打開一個空白的C語言文件,首先先定義一組待排序的數列以及各個變數,接著就是用來處理排序的邏輯:
Ⅱ 用c語言編寫全部排列
void chang(char str[],int m) /*定義循環左移函數(我沒有用左移函數)*/
{
int i,j;
char temp=str[0];
for (i=0;i<m;i++) str[i]=str[i+1];
str[i]=temp;
}
void pai(char str[],int m,int n) /*定義全排列函數*/
{
int k;
void chang(char str[],int m);
if (m<n) /* 定 義 遞 歸 調 用 出 口 */
{
for (k=0;k<=m;k++)
{
pai(str,m+1,n); /*遞歸調用*/
chang(str,m); /*調用左移函數*/
}
}
else printf("%s\t",str);
}
#include "stdio.h"
main()
{char str[]="ABCD"; /*全排列字元,可以任意多個(相應的下面排列函數中參數"4"改成全排列字元的個數)*/
clrscr();
pai(str,0,4); /*這里參數0(下標)表示從第一個元素開始,4表示元素個數(不是下標)*/
getch();
}
Ⅲ c語言三種排序
常用的c語言排序演算法主要有三種即冒泡法排序、選擇法排序、插入法排序。
一、冒泡排序冒泡排序:
是從第一個數開始,依次往後比較,在滿足判斷條件下進行交換。代碼實現(以降序排序為例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp;
for (int i = 0; i < 10; i++)
{//循環次數
for (int j = 0; j <10 - i-1; j++)
{
if (array[j] < array[j+1])
{//前面一個數比後面的數大時發生交換 temp = array[j];
array[j] = array[j+1];
array[j + 1] = temp;
}
}
} //列印數組 for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}
二、選擇排序以升序排序為例:
就是在指定下標的數組元素往後(指定下標的元素往往是從第一個元素開始,然後依次往後),找出除指定下標元素外的值與指定元素進行對比,滿足條件就進行交換。與冒泡排序的區別可以理解為冒泡排序是相鄰的兩個值對比,而選擇排序是遍歷數組,找出數組元素與指定的數組元素進行對比。(以升序為例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp, index;
for (int i = 0; i < 9; i++) {
index = i;
for (int j = i; j < 10; j++)
{
if (array[j] < array[index])
index = j;
}
if(i != index)
{
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for(int i=0;i<10:i++)
printf("%2d"array[i])
return 0;
}
三、快速排序
是通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
void QuickSort(int* arr, int size)
{
int temp, i, j;
for(i = 1; i <size; i++)
for(j=i; j>0; j--)
{
if(arr[j] <arr[j-1])
{
temp = arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
Ⅳ C語言怎麼實現有重復元素的全排列
整體思路就是利用回溯的思想,也可認為是深度優先搜索
從字元串第一位idx=0開始,每次遞歸都從s[idx]之後選擇一個字元與s[idx]交換
因為可能有重復字元,可使用哈希數組標記當前循環每個字元是否被選擇
因為字元范圍不超過ASCII碼,所以使用128空間的數組足夠用來標記了
選擇好當前字元s[i]並與s[idx]交換之後,遞歸調用繼續排列下一位s[idx+1]
注意這里要進行回溯,即不選s[i]而選擇之後的某個字元交換到s[idx]
所以要將之前的s[i]與s[idx]交換過來,恢復原狀,才能循環判斷下一個選擇
具體代碼截圖如下:
結果正確,望採納~
附源碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000000 // 排列總數可能很多
int num = 0; // 記錄排列總數
char *res[MAXN] = {NULL}; // 指針數組保存排列結果
void swap(char *x, char *y) { // 交換兩個字元變數的內容
char ch = *x;
*x = *y;
*y = ch;
}
void perm(char *s, int n, int idx) { // 回溯產生字元串全排列
if (idx == n) { // 已排列到字元串結尾
res[num] = (char *)malloc(sizeof(char) * (n + 1));
//printf("%s ", s); // 輸出當前排列
strcpy(res[num], s); // 保存當前排列
num++; // 排列總數加1
return;
}
int i, hash[128] = {0}; // 哈希數組,標記每個字元是否被選擇
for (i = idx; i < n; i++) {
if (hash[s[i]] == 1)
continue; // 跳過已被標記過的重復字元
hash[s[i]] = 1; // 選過的話在數組中標記為1
swap(&s[idx], &s[i]); // 選擇s[i]交換到s[idx]
perm(s, n, idx + 1); // 遞歸,繼續s[idx+1]的選擇
swap(&s[idx], &s[i]); // 回溯,當前不選擇s[i],而選擇其他字元
}
}
int main() {
int n, i;
scanf("%d", &n);
char *s = (char *)malloc(sizeof(char) * (n + 1));
scanf("%s", s);
perm(s, n, 0);
printf("一共有%d種排列: ", num); // 輸出排列總數
for (i = 0; i < num; i++) { // 輸出所有排列
printf("%s ", res[i]);
free(res[i]); // 釋放內存空間
}
free(s);
return 0;
}
Ⅳ C語言怎麼實現排列
#include<stdio.h>
intmain(void){
chars[]="11111",i,j;
for(i=0;i<4;s[i++]='1')
for(s[i]='0',j=i+1;j<5;j++){
s[j]='0';
printf("%s ",s);
s[j]='1';
}
return0;
}
Ⅵ C語言數組排列怎麼做
對n個數排序,先輸入n,再輸入n個數。
選擇排序
#include<stdio.h>
int main()
{
int a[100];
int i,j,t,p,n;
while (~scanf("%d",&n))
{
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n-1;i++)
{
p=i;
for (j=i+1;j<n;j++)
if (a[p]>a[j])
p=j;
if (p!=j)
{
t=a[p];a[p]=a[i];a[i]=t;
}
}
for (i=0;i<n;i++)
if (i!=n-1)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
return 0;
}
冒泡排序
#include<stdio.h>
int main()
{
int i,j,t,n;int a[1000];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<(n-1);j++)
for(i=0;i<(n-1)-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
for(i=0;i<n;i++)
{
if (i!=n-1)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
return 0;
}
Ⅶ c語言實現三個數從小到大排列
兩個數的排序,只需要比較一下,如果第一個比第二個大,交換一下,否則什麼都不用做。
三個數的排序
,可以先將前兩個排序,保證第一個比第二個小。
然後將第二個和第三個數排序,保證第二個比第三個小。
經過上面兩次排序,保證了第三個是最大的,但不能保證第二個還比第一個大,因為第二次排序的時候可能改變了第二個數。因此,還要再將前兩個數進行排序。最終保證了三個整數從小到大排列。
Ⅷ c語言排列問題
下面是C語言裡面常用的三種排序方法,但願對樓主有幫助,一、冒泡法(起泡法)演算法要求:用起泡法對10個整數按升序排序。演算法分析:如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次相鄰元素的兩兩比較,在第j趟比較中要進行n-j次兩兩比較。比較的順序從前往後,經過一趟比較後,將最值沉底(換到最後一個元素位置),最大值沉底為升序,最小值沉底為降序。演算法源代碼: # include main() { int a[10],i,j,t; printf("Please input 10 numbers: "); /*輸入源數據*/ for(i=0;i<10;i++) scanf("%d",&a[i]); /*排序*/ for(j=0;j<9;j++) /*外循環控制排序趟數,n個數排n-1趟*/ for(i=0;i*內循環每趟比較的次數,第j趟比較n-j次*/ if(a[i]>a[i+1]) /*相鄰元素比較,逆序則交換*/ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } /*輸出排序結果*/ printf("The sorted numbers: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); } 演算法特點:相鄰元素兩兩比較,每趟將最值沉底即可確定一個數在結果的位置,確定元素位置的順序是從後往前,其餘元素可能作相對位置的調整。可以進行升序或降序排序。演算法分析:定義n-1次循環,每個數字比較n-j次,比較前一個數和後一個數的大小。然後交換順序。二、選擇法演算法要求:用選擇法對10個整數按降序排序。演算法分析:每趟選出一個最值和無序序列的第一個數交換,n個數共選n-1趟。第i趟假設i為最值下標,然後將最值和i+1至最後一個數比較,找出最值的下標,若最值下標不為初設值,則將最值元素和下標為i的元素交換。演算法源代碼: # include main() { int a[10],i,j,k,t,n=10; printf("Please input 10 numbers:"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i main() { int a[10],i,j,t; printf("Please input 10 numbers: "); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=1;i*外循環控制趟數,n個數從第2個數開始到最後共進行n-1次插入*/ { t=a[i]; /*將待插入數暫存於變數t中*/ for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下標0 ~ i-1)中尋找插入位置*/ a[j+1]=a[j]; /*若未找到插入位置,則當前元素後移一個位置*/ a[j+1]=t; /*找到插入位置,完成插入*/ } printf("The sorted numbers: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); } 演算法特點:每趟從無序序列中取出第一個數插入到有序序列的合適位置,元素的最終位置在最後一趟插入後才能確定位置。也可是先用循環查找插入位置(可從前往後或從後往前),再將插入位置之後的元素(有序列中)逐個後移一個位置,最後完成插入。該演算法的特點是在尋找插入位置的同時完成元素的移動。因為元素的移動必須從後往前,則可將兩個操作結合在一起完成,提高演算法效率。仍可進行升序或降序排序。二、下面是三種排序的概念及其優缺點冒泡排序已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。再比較a[3]與a[4],依此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組數據中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。優點:穩定,比較次數已知;缺點:慢,每次只能移動相鄰兩個數據,移動數據的次數多。選擇排序已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。再比較a[1]與a[4],依此類推,最後比較a[1]與a[n]的值。這樣處理一輪後,a[1]的值一定是這組數據中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。再將a[3]與a[4]~a[n]以相同方法比較一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。優點:穩定,比較次數與冒泡排序一樣,數據移動次數比冒泡排序少;缺點:相對之下還是慢。插入排序已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將二者合並成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)優點:穩定,快;缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。
Ⅸ c語言編程排列組合
void Show(int n,int len ,char str[], char p[],int *i){/*函數功能說明:
密碼窮舉法 遞歸演算法參數說明:len 密碼可選元素的個數,實際等於 strlen(str);
n 密碼位數。
STR[]密碼表。
*p 密碼排列組合的臨時存檔*/int a;n--;for(a=0; a < len; a++){p[n]=str[a];
if(n==0)printf("%d:%s ",(*i)++,p);
if(n0)Show(n,len , str,p,i);}}
/*驅動程序 用於測試*/
int main(void){char str[]="abcdef";//密碼表 可選元素集合可根據選擇修改
int n=4;//密碼位數,根據具體應用而定。
int len=strlen(str);//用於密碼元素集合計數。
char p[20];//存放排列組合的密碼,用於輸出。
int num=0;//存放統計個數的整數值,
int *i=#//計數器 地址。
p[n]='\0';//這個不用說啦。
printf("\n%d 位密碼,每個密碼有%d個選擇的話,共有:%d個組合。\n",n,len,*i);return 0;}
以上回答你滿意么?
Ⅹ C語言如何輸入十個數,按從大到小順序排列!
用選擇排序法編寫c語言,實現從鍵盤上輸入10個數,按從大到小的順序排序輸出。代碼如下:
#include<stdio.h>
int main()
{
int i,j,a[10],t;
printf("輸入數");
for (i = 0; i < 10; i++)
scanf("%d",&a[i]);
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10;j++)
if (a[i] < a[j]){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
printf("從大到小");
for (i = 0; i < 10; i++)
printf("%2d", a[i]);
return 0;
}
(10)c語言實現排列擴展閱讀:
代碼還可以設計,如下:
#include<stdio.h>
int main()
{
int a[10],i,j,t;//定義數組;
for(i=0;i<10;i++){
scanf("%d",&a[i]);//給數組賦值;
}
for(i=0;i<9;i++)//10個數,進行9輪比較;
for(j=0;j<10-i;j++){//第一個數比較9次,依次遞減;
if(a[j]>a[j+1]) {//交換值;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i<10;i++){
printf("%d ",a[i]);//輸出數組的值;
}
return 0;
}
}
printf("the sorted numbers: ");
for(i=0;i<10;i++)
printf(" %d",a[i]);
printf(" ");
}