当前位置:首页 » 编程语言 » c语言实现排列

c语言实现排列

发布时间: 2022-12-30 06:27:14

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=&num;//计数器 地址。 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(" ");

}

热点内容
python程序设计第三版课后答案 发布:2025-07-03 03:58:08 浏览:212
socket上传文件 发布:2025-07-03 03:57:24 浏览:894
安卓cleo脚本 发布:2025-07-03 03:41:26 浏览:245
编程器解读 发布:2025-07-03 03:22:49 浏览:24
中国电信加密通信业务 发布:2025-07-03 03:06:00 浏览:521
脚本家的台词 发布:2025-07-03 03:05:50 浏览:709
arcgisforpython 发布:2025-07-03 03:05:46 浏览:899
期计算法 发布:2025-07-03 02:56:53 浏览:405
不同域访问 发布:2025-07-03 02:49:05 浏览:819
多槽编程 发布:2025-07-03 02:47:42 浏览:920