A. 急求:用c语言程序对一组大小不定的数字排序拜托了各位 谢谢
第一个就是冒泡排序法,几乎是最简单的排序方法:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
int
main(
void
)
{
int
i,
j,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
//
冒泡排序法进行排序
for(
i
=
0;
i
<
N
-
1;
i++
){
for(
j
=
0;
j
<
N-i-1;
j++
){
if(
a[i]
<
a[j]
){
temp
=
a[i]
;
a[i]
=
a[j]
;
a[j]
=
temp
;
}
}
}//第一个for
printf("你是入的十个数是:\n")
;
for(
i
=
0;
i
<
N;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
下面的是选择排序法,比冒泡排序法的效率高:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
int
main(
void
)
{
int
i,
j,
k,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
//
选择排序法进行排序
for(
i
=
0;
i
<
N
-
1;
i++
){
k
=
i
;
for(
j
=
i
+
1;
j
<
N;
j++
){
if(
a[k]
<
a[j]
){
k
=
j
;
}
temp
=
a[i]
;
a[i]
=
a[k]
;
a[k]
=
temp
;
}
}//第一个for
printf("你是入的十个数是:\n")
;
for(
i
=
0;
i
<
N;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
下面的是插入排序法,比冒泡排序法和选择排序法的效率都要高:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
int
main(
void
)
{
int
i,
j,
key,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
//
插入排序法进行排序
for(
i
=
1;
i
<
N
;
i++
){
key
=
a[i]
;
for(
j
=
i
-
1;
j
>=
0;
j--
){
if(
a[j]
<
key
){
a[j+1]
=
a[j]
;
}
}
a[j+1]
=
key
;
}//第一个for
printf("你是入的十个数是:\n")
;
for(
i
=
0;
i
<
N;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
下面的是归并排序法,我是在看了《算法导论》之后才写的,我自己写不出来。代码写出来很简单,比其它一些书上的简单多了。归并排序法的效率是这四个排序法中效率最高的:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
void
merge_sort(
int
*a,
int
p,
int
q,
int
r
)
{
int
i,
j,
k,
m,
n
;
int
array1[N],
array2[N]
;
//
m和n分别是新建立的两个数组中
//
元素的个数
m
=
q
-
p
+
1
;
n
=
r
-
q
;
//
先把数组a[N],中的元素放进
//
新建立的两个数组中
for(
i
=
0;
i
<
m;
i++
){
array1[i]
=
*(
a
+
p
+
i
)
;
}
for(
j
=
0;
j
<
n;
j++
){
array2[j]
=
*(
a
+
q
+
j
+1
)
;
}
i
=
j
=
0
;
k
=
p
;
//
k
不能被初始化为
0
//
开始归并
while(
i
<
m
&&
j
<
n
){
if(
array1[i]
>
array2[j]
){
*(
a
+
k
)
=
array1[i]
;
++
k
;
++
i
;
}
else{
*(
a
+
k
)
=
array2[j]
;
++
k
;
++
j
;
}
}
//
归并每个数组剩下的元素
while(
i
<
m
){
*(
a
+
k
)
=
array1[i]
;
++
k
;
++
i
;
}
while(
j
<
n
){
*(
a
+
k
)
=
array2[j]
;
++
k
;
++
j
;
}
}
void
merge(
int
*a,
int
p,
int
r
)
{
int
q
;
//
p
>=
r的情况就是要排序的元素只有一个,
//
也就是说,它已经被排好了
if(
p
<
r
){
q
=
(p
+
r)/2
;
merge(
a,
p,
q
)
;
merge(
a,
q
+
1,
r
);
merge_sort(
a,
p,
q,
r
);
}
}//
merge
int
main(
void
)
{
int
i,
j,
key,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
merge(
a,
0,
9)
;
printf("你是入的十个数是:\n")
;
for(
i
=
0;
i
<
10;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
B. c语言如何将一个数组中的数值排好顺序
使用冒泡排序法进行编程:
解释:
1.第一个for循环:利用数组循环输入4个变量。
2.第二个for循环:该循环的意思是如果a[0]>a[1]的话,两个变量的值交换,利用循环依次比较。要注意的是i<3,因为其中有i+1,i最大取到2,也就是i+1最大取到3才正确。
3.第三个for循环:利用循环依次输出排序后的数组,每输出一个加一个空格以便于区分。
(2)c语言数字组成的排列扩展阅读:
冒泡排序法,从数组头部开始,不断比较相邻的两厅笑个元素的大小,通过交换两个元素的值使较大的元素逐渐银物往后移动,扮搏含直到数组的末尾。
经过第一轮的比较,就可以找到最大的元素,并将它移动到最后一个位置。第一轮结束后,继续第二轮。仍然从数组头部开始比较,让较大的元素逐渐往后移动,直到数组的倒数第二个元素为止。
经过第二轮的比较,就可以找到次大的元素,并将它放到倒数第二个位置。
以此类推,进行 n-1(n 为数组长度)轮“冒泡”后,就可以将所有的元素都排列好。
C. C语言数字排序
输入scanf是用的变量地址
&x
&y
&z
输出时,是用的变量x,
y,
z
所以sort3要改变这3个变量地址(指针)指向的值
#include
<stdio.h>
void
sort3(double
*x,
double
*y,
double
*z);
int
main(int
argc,
char
*argv[]){
double
x,y,z;
if(scanf("%lf
%lf
%lf",&x,&y,&z)==3){
sort3(&x,&y,&z);
printf("%lf\n%lf\n%lf\n",x,y,z);
}else{
fprintf(stderr,"Error:
Incorrect
format\n");
}
return
0;
}
void
sort3(double
*x,
double
*y,
double
*z){
double
a
=
*x,
b
=
*y,
c
=
*z;
printf("a:%f
b:%f
c:%f\n",a,
b,
c);//testing
if(*x
>
*y)
{
a
=
*y;
b
=
*x;
}
if(c
<
a)
{
*x
=
c;
*y
=
a;
*z
=
b;
}
else
if(c
<
b)
{
*x
=
a;
*y
=
c;
*z
=
b;
}
else
{
*x
=
a;
*y
=
b;
*z
=
c;
}
printf("sorted
numbers:\n");//testing
printf("%f
%f
%f\n",*x,
*y,
*z);//testing
}
D. 用c语言编写程序,输出7,8,9三个数字的全部排列组合顺序
voidmain()
{
intmaxRow=5;//输出行数
intnum=1;
for(inti=0;i<maxRow;i++)
{
for(intj=0;j<=i;j++)
{
printf(num++);
printf(" ");
}
printf(" ");
}
}
E. C语言~十个数字从小到大怎么排列~从大到小呢~
//要求任意输入10个数,然后按从小到大顺序输出
#include <stdio.h>
int main()
{
int a[10];
int i,j;
int temp;
printf("请输入10个整数:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("排列后顺序为:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("
");
return 0;
}
F. 在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的全排列。
(6)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;
}
G. c语言编程: 将一组数按从大到小的顺序排序
#include <stdio.h>
main()
{
int x;
printf("请输入要排序数字个数:");
scanf("%d",&x);
int i,j,k,a,b,num[x];
printf("输入数据:");
for(i=0;i<x;i++)
scanf("%d",&num[i]);
for(j=0;j<x;j++)
{
for(k=j+1;k<x;k++)
if(num[k]>num[j])
{
a=num[j];
num[j]=num[k];
num[k]=a;
}
}
for(b=0;b<x;b++)
printf("%d ",num[b]);
return 0;
}
(7)c语言数字组成的排列扩展阅读:
include用法:
#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。
插入头文件的内容
#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:
1、#include<文件名>
2、#include"文件名"
如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:
#include<math.h>//一些数学函数的原型,以及相关的类型和宏
如果需要包含针对程序所开发的源文件,则应该使用第二种格式。
采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。
H. c语言把十个数排列在一起,怎样使它们最大的三个数用序号表示
你的问题是对十个数字,找出其中最大的三个数的序号(对应数组的下标和皮哪)。
方法不止一种,我的思路:
1、随机数生成10个数字组成数组num。
2、定义一个数组x,用于保存最大三个数字的下标(数字大小是从大到小)。
3、遍历num找出数组最小值的下标,将其保存到变量mi中。
4、用mi的值初始化x(也就是初始三个数都对应最小数字)。
5、再次遍历num,每次和x中对应的每一数对比,发现大于的,则当前x元素全部往后移动一位,并且将当前数值下标记录在x当前元素内。
最后得到的数组x就是题目要的序号。
PS:写程序考虑要扩展和通用,因此所有参数(数字个数,数字位数,最大数的个数)都定义成常量,只要修改常量可适应n个数排列,求最大m个数的序号。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MN 10//最大数字个数
#define N 100//单个数字不超过
#define M 3//想要统计的最大数量(题目要最大前3,可改其它值)
int main()
{
int i=0,num[MN],mi=0,x[M]={0},*p=&x[0],*p2=NULL;
srand(time(NULL));
printf("数组(随机)为: ");
while(i<MN)
{
num[i]=rand()%N;
if(num[i]<num[mi])mi=i;//找出最小值序号
printf("%d ",num[i++]);
}
for(i=0;i<M;i++)x[i]=mi;//用最小值下标初始化x数组
printf(" ");
i=0;
while(i<MN)
{
p=&x[0];
while(1)
{
if(num[i]>num[*p])
{
p2=&x[M-1];
while(p2>p)*p2=*(p2-1),p2--;//x当前位往后依次后移
*p=i;
break;
}
else p++;
if(p>&x[M-1])
break;
}
i++;
}
printf(" 其中最大的三个数组序号分别为(序号从0开始): ");
for(i=0;i<M;i++)
printf("数字%d,序号%d。 ",num[x[i]],x[i]);
return 0;
}
I. 用c语言怎么实现排列组合啊比如从100个数里面任意选出5个数,即C100 5……
#include<stdio.h>
void main()
{
int n = 100;
int m = 5;
int n1 = 1, m1 = 1;
for(int i = 1; i <= m; i++)
{
n1 *= n - i + 1;
m1 *= i;
}
n1 = n1/m1;
printf("C100 5 = %d\n",n1);
}
从n中选出m个,只要改变n和m的值即可,VS2010下测试通过。
J. C语言,输入一组数进行排序,由大到小排列,用自定义函数实现
给你一个直接插入排序
#include "stdio.h"
void InsertSort(int a[], int left, int right) {//对数组a从下标为left到right区域进行直接插入排序
int i, j, tmp;
for(i = left + 1; i <= right; i++) {
for(j = i - 1, tmp = a[i]; j >= left && tmp > a[j]; j++)
a[j + 1] = a[j];
a[j + 1] = tmp;
}
}
void main( ) {
int i, n, a[100];
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
InsertSort(a, 0, n - 1);
printf("\n");
for(i = 0; i < n; i++) printf("%d\t", a[i]);
}