C语言数组排序题目

合集下载

C语言专题编程练习——数组

C语言专题编程练习——数组

编程练习4 ——数组1. 随机数数组输出。

要求:产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。

输出结果:2. 求数组最大值、最小值、总和、平均数。

要求:产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。

求该数组的最大值、最小值、总和和平均值并输出。

输出结果:3. 冒泡法排序。

要求:产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。

按照升序排列并输出。

输出结果:4. 选择法排序。

输出结果:同上5. 比较法排序。

输出结果:同上6. 数组逆序输出要求:产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。

编程将逆序数组输出。

输出结果:7. 数组插数。

要求:产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。

按照升序排列并输出。

再输入一个数,按照原来的规律将其插入并输出。

输出结果:8. 用数组输出Fibonacci数列的前40项。

要求:每行输出5个元素,每个元素10位。

输出结果:(略)9. 用筛选法求100以内的素数。

输出结果:10. 数组查找。

要求:产生一个由15个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。

按照升序排列并输出。

再输入一个数,要求找出该数是数组中的第几个元素,如果不在数组中,输出找不到。

11. 二维数组行列互换。

要求:将一个二维数组(3行4列)的行和列互换(转置),存到另一个二维数组(4行3列)中并输出。

输出结果:12. 编程输出杨辉三角(要求输出10行)。

输出结果:13. 编程输入5阶魔方阵。

输出结果:14. 找出一个二维数组中的鞍点。

要求:即该位置上的元素在该行最大,在该列最小。

可能没有鞍点。

输出结果:15. 输入一行字符,统计大写字母、小写字母、数字、空格以及其他字符个数。

输出结果:16. 编写程序实现strcat函数功能。

输出结果:17. 编写程序实现strcpy函数功能。

c语言数组的合并和升序排列

c语言数组的合并和升序排列

在C语言中,你可以使用内建的排序函数`qsort`来对数组进行排序,然后使用冒泡排序或者插入排序等算法将两个数组进行合并。

以下是一个示例:```c#include <stdio.h>#include <stdlib.h>// 函数比较两个整数int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);}// 函数用于合并两个已排序的数组void merge(int arr[], int size1, int arr1[], int size2) {int i = 0, j = 0, k = 0;while (i < size1 && j < size2) {if (arr1[i] <= arr[j]) {arr[k++] = arr1[i++];} else {arr[k++] = arr[j++];}}while (i < size1) {arr[k++] = arr1[i++];}while (j < size2) {arr[k++] = arr[j++];}}int main() {int arr1[] = {1, 5, 7};int arr2[] = {2, 6, 8};int size1 = sizeof(arr1) / sizeof(arr1[0]); int size2 = sizeof(arr2) / sizeof(arr2[0]); int arr[size1 + size2];int i;for (i = 0; i < size1; i++) {arr[i] = arr1[i];}for (i = 0; i < size2; i++) {arr[i + size1] = arr2[i];}qsort(arr, size1 + size2, sizeof(int), compare); // 对数组进行排序merge(arr, size1, arr1, size2); // 合并两个数组for (i = 0; i < size1 + size2; i++) { // 打印合并后的数组printf("%d ", arr[i]);}return 0;}```在这个代码中,`compare`函数是用于比较两个整数的。

C语言数组编程题及解答

C语言数组编程题及解答

C语言数组编程题及解答【程序1】用筛选法求100之内的素数筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。

据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛子。

具体做法是:先把N个自然数按次序排列起来。

1不是质数,也不是合数,要划去。

第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。

2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。

3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。

这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。

因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。

#include <stdio.h>#include <math.h>void main(){int i,j;int a[100];for(i=0;i<100;i++)a[i]=i+1;for(i=1;i<100;i++){if(a[i]==0)continue;for(j=i+1;j<100;j++)if(a[j]%a[i]==0)a[j]=0;}for(j=1;j<100;j++) //j从1开始,去除a[0](其值为1),因为1既不是质数,也不是合数if(a[j]!=0)printf("%d,",a[j]);printf("\n");}【程序2】题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。

例如6=1+2+3.编程找出1000以内的所有完数。

程序源代码:#include <stdio.h>int main(){int k[10];int i,j,n,s;for(j=2;j<1000;j++){n=-1;s=j;for(i=1;i<j;i++){if ((j%i)==0){n++;s=s-i;k[n]=i;}}if(s==0) //说明是完数{printf("%d is a wanshu:",j);for(i=0;i<=n;i++)printf("%d ",k[i]);printf("\n");}}return 1;}【程序3】题目:用选择法对10个数进行从大到小排序1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。

C语言必背的典型程序设计题目 - 数组、函数-------参考答案

C语言必背的典型程序设计题目 - 数组、函数-------参考答案

数组部分必须会编写的程序(参考答案)1、使用选择法、冒泡法对10个数进行排序,并输出排序前后的数列。

//选择法#include<stdio.h>void main(){int a[10]={12,45,7,8,96,4,10,48,2,46},n=10,i,j,t,temp;printf("Before sort:");for(i=0;i<10;i++){printf("%4d",a[i]);}printf("\n");//排序for(i=0;i<9;i++){t=i;for(j=i+1;j<10;j++){if(a[t]>a[j]){t=j;}}if(t!=i){temp=a[i];a[i]=a[t];a[t]=temp;}}printf("Aftere sorted:");for(i=0;i<10;i++){printf("%4d",a[i]);}printf("\n");}//冒泡法#include<stdio.h>void main(){int a[10]={12,45,7,8,96,4,10,48,2,46},n=10,I,j,t;printf(“Before sort:”);for(i=0;i<10;i++){printf("%4d",a[i]);}prtintf(“\n”);//排序for(i=0;i<=n-1;i++){for(j=0;j<i;j++)if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;}}printf(“Aftere sorted:”);for(i=0;i<10;i++){printf("%4d",a[i]);}prtintf(“\n”);}2、已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列。

c语言数组试题及答案

c语言数组试题及答案

c语言数组试题及答案1. 请编写一个程序,要求用户输入10个整数,然后将其存储在一个数组中,并输出这个数组的内容。

答案:```c#include <stdio.h>int main() {int numbers[10];int i;printf("请输入10个整数:\n");for (i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}printf("数组内容为:\n");for (i = 0; i < 10; i++) {printf("%d ", numbers[i]);}return 0;}```2. 请编写一个程序,要求用户输入一个整数n(n>0),然后分别输入n个整数存储在一个数组中,计算并输出这个数组中所有元素的和。

答案:```c#include <stdio.h>int main() {int n;int numbers[100];int sum = 0;int i;printf("请输入整数n:\n");scanf("%d", &n);printf("请输入%d个整数:\n", n);for (i = 0; i < n; i++) {scanf("%d", &numbers[i]);sum += numbers[i];}printf("数组元素之和为:%d\n", sum);return 0;}```3. 请编写一个程序,要求用户输入一个整数n(n>1),然后分别输入n个整数存储在一个数组中,计算并输出这个数组中最大和最小的元素。

答案:```c#include <stdio.h>int main() {int n;int numbers[100];int max, min;int i;printf("请输入整数n:\n");scanf("%d", &n);printf("请输入%d个整数:\n", n);for (i = 0; i < n; i++) {scanf("%d", &numbers[i]);}max = numbers[0];min = numbers[0];for (i = 1; i < n; i++) {if (numbers[i] > max) {max = numbers[i];}if (numbers[i] < min) {min = numbers[i];}}printf("数组中的最大元素为:%d\n", max);printf("数组中的最小元素为:%d\n", min);return 0;}```4. 请编写一个程序,要求用户输入两个整数m和n(1<=m<=n<=100),然后生成并输出m到n之间(包含m和n)的所有整数。

C语言顺序结构作业(含解答)

C语言顺序结构作业(含解答)

顺序结构作业解答(2)一、选择题:1.有以下程序:#include<stdio.h>void main(){ int a=10, b=20, c=30; printf(“%d\n”, (a=50, b*a,c+a));}程序运行后输出结果是a)40 b)50 c)600 d)80答案:d)解答:(a=50, b*a,c+a)是一个逗号表达式,执行的顺序按排列顺序进行,整个表达式的值是括号中最后一个表达式的值。

计算过程:a=50,——> a的值为50;a*b, ——> a的值仍然为50,b的值仍然为20;a*b的值为1000;c+a, ——> a的值仍然为50,c的值仍然为30;c+c的值为30+50,即80;2.有以下程序:#include<stdio.h>void main(){ int x;x=x++;printf("%d\n", x);}程序运行后输出结果是a) 1 b)0 c)编译出错 d)不错定答案:d)解答:x=x++;的执行顺序为:首先取x的值,那么x的值是什么呢?在一对{ } 之间定义的变量,称为局部变量,系统对没有赋初值的局部变量不作任何处理,即,它的值是不确定的。

然后将取出的x值赋给“=”左边的x,最后x的值增1;进一步思考:如果上面的程序段改成:#include<stdio.h>void main(){ int x=1;x=x++;printf("%d\n", x); }程序运行后输出结果应该是什么值?3.有以下程序:#include<stdio.h>void main(){ int x=1, y=5,z; z=x%y; z++; printf(“%d\n”, z); } 程序运行后输出结果是a) 1 b)2 c)5 d)0答案:b)解答:z=x%y;的执行结果为:1%5(1除以5的余数)的值为1;将1赋给z;z++;的执行结果为:z的值增1;4.有以下程序:#include<stdio.h>void main(){float x=1, y=5,z;z=x%y;z++;printf(“%d\n”, z); }程序运行后输出结果是a) 2 b)5c)编译程序指出,程序第5行有错 d) 编译程序指出,程序第5、6、8行有错答案:c)解答: 1. %运算两个运算数必须是整数;2. ++运算的运算量必须是整型变量;但是因为在之前已经指出z的错误,所以这里不再给出错误信息。

c语言排序题

c语言排序题

c语言排序题题目:编写一个C语言程序,该程序接收一个整数数组和数组的大小作为输入,并使用冒泡排序算法对数组进行升序排序。

程序应该输出排序后的数组。

示例代码:c#include <stdio.h>// 交换两个整数的函数void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}// 冒泡排序函数void bubbleSort(int arr[], int n) {int i, j;for (i = 0; i < n-1; i++) {for (j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {swap(&arr[j], &arr[j+1]);}}}}// 打印数组的函数void printArray(int arr[], int size) {int i;for (i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}// 主函数int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90}; // 示例数组int n = sizeof(arr)/sizeof(arr[0]); // 计算数组大小bubbleSort(arr, n); // 对数组进行排序printf("Sorted array: \n");printArray(arr, n); // 打印排序后的数组return 0;}在这个示例中,我们定义了三个函数:swap 用于交换两个整数的值,bubbleSort 用于实现冒泡排序算法,printArray 用于打印数组的内容。

main 函数是程序的入口点,它定义了一个待排序的整数数组,并调用bubbleSort 函数对其进行排序,最后调用printArray 函数打印出排序后的结果。

简单选择排序C语言

简单选择排序C语言

算法原理:通过相邻元素比较和交换,将较大的元素逐渐往后移动 时间复杂度:O(n^2),其中n为元素数量 空间复杂度:O(1),即算法只需要常数级别的额外空间 适用场景:适用于小规模数据的排序,但对于大规模数据排序效率较低
时间复杂度:简单选 择排序的时间复杂度 为O(n^2),与其他排 序算法相比可能较慢
快速排序算法的时间复杂度为O(nlogn),在平均情况下比简单选择排序和冒泡排序更高效。
快速排序算法的空间复杂度为O(logn),需要额外的空间来存储递归调用的函数栈。
快速排序算法在处理大数据集时表现优秀,但在最坏情况下(输入数据已经有序或接近有序)的时间复杂度会退 化到O(n^2)。
空间复杂度:O(1),因为算法只需 要常数级别的额外空间。
添加标题
添加标题
添加标题
添加标题
时间复杂度:最好、最坏和平均情 况下为O(n^2),其中n是数组长度。
适用场景:对于小规模数据的排序, 插入排序相对简单且易于实现。
快速排序算法的基本思想是采用分治法,将数组分成两个子数组,分别对子数组进行排序,然后合并成一个有序 数组。
代码示例:下面是一个简单的C语言实现简单选择排序的代码示例,可以帮助理解算法的实现过程。
注意事项:在实现简单选择排序时需要注意数组越界的问题,以及在处理大数据量时需要考虑算法的时间 复杂度和空间复杂度。
数组元素必须为整数 数组元素必须为正整数 数组元素必须按升序排列 数组元素不能重复
减少比较次数
限制:对于大型数据集,简单选择排序算法的性能较差,有更高效的排序算法可供选择,如快速排序、归并排序 等。
场景:简单选择排序算法适用于对稳定性要求不高的场景,如对少量数据进行快速排序、对小型数据集进行初步 排序等。

C语言常用经典代码:小学生算数、数组合并问题、选择删除X元素、数组元素排序

C语言常用经典代码:小学生算数、数组合并问题、选择删除X元素、数组元素排序

C语言常用经典代码小学生算数、数组合并问题、选择删除X元素、数组元素排序/*小学生算数第二种方法*/#include <stdio.h>#include <stdlib.h>#include <time.h>int question_get1();int question_get2();int type;void main( void ){int answer,Lever;srand( (unsigned)time( NULL ) );out:printf("1.一位数运算!2.两位数运算!\n");scanf("%d",&Lever);printf( "请选择要测试的题目种类:" );printf( "\n1.加法\n2.减法\n3.乘法\n4.除法\n" );scanf( "%d", &type );while( 1 )//实现系统循环{int temp;char flag;while(Lever==1){answer = question_get1();//调用一位数运算函数printf( "请给出你的答案:\n" );break;//要跳出此次while循环}while(Lever==2){answer = question_get2();//调用二位数运算的函数printf( "请给出你的答案:\n" );break;//要跳出此次while循环}fflush( stdin );scanf( "%d", &temp );//储存测试者输入的结果while( temp!=answer )//判断结果的对错错误时实现循环运算{printf( "\n笨蛋,you are wrong! again!\n" );fflush( stdin );//继续运算scanf( "%d", &temp );}printf( "\n天才!you are rigth! Very good!\n" );printf( "press 1 to go on,press 2 to exit,press 0 to end!\n" );//选择菜单fflush( stdin );scanf( "%c", &flag );while( flag!='1' && flag!='2'&&flag!='0' )//选择菜单判断{printf( "press 1 to go on,press 2 to exit,press 0 to end!\nelse no working!\n" );fflush( stdin );scanf( "%c", &flag );}if ( flag=='2' )goto out;//回到out实现整个系统的循环else if(flag=='0')break;//结束本程序}}int question_get1()//子函数一位数运算{int a,b,c;if( type==1 ){a=rand()%10;//在10以内产生随机数b=rand()%10;//在10以内产生随机数printf( "%d + %d = ?", a, b );return(a+b);}else if( type==2 ){b=rand()%10;//在10以内产生随机数c=rand()%10;//在10以内产生随机数printf( "%d - %d = ?", b+c, b );return(c);}else if( type==3 ){a=rand()%10;//在10以内产生随机数b=rand()%10;//在10以内产生随机数printf( "%d * %d = ?", a, b );return(a*b);}else{b=rand()%10;c=rand()%9+1;printf( "%d / %d = ?", b*c, b );return(c);}}int question_get2()//子函数二位数运算{int a,b,c;if( type==1 ){a=rand()%100;//在100以内产生随机数b=rand()%100;//在100以内产生随机数printf( "%d + %d = ?", a, b );return(a+b);}else if( type==2 ){b=rand()%100;//在100以内产生随机数c=rand()%100;//在100以内产生随机数printf( "%d - %d = ?", b+c, b );return(c);}else if( type==3 ){a=rand()%100;//在100以内产生随机数b=rand()%100;//在100以内产生随机数printf( "%d * %d = ?", a, b );return(a*b);}else{b=rand()%10;c=rand()%10+1;printf( "%d / %d = ? ", b*c , c );return(b);}}//数组合并问题/*本程序可实现将随机产生的两个数m<10,n<100;\n将n插入随机产生的一个10元素一维数组第m个位置上*/#include "stdio.h"#include "stdlib.h"#include "time.h"int main(){int A[11];int i,m,n,c;srand( (unsigned)time( NULL ) );printf("*本程序可实现将随机产生的两个数m<10,n<100;\n将n插入随机产生的一个10元素一维数组第m个位置上\n");while(1){printf("\n*.按1 运行本程序\n*.按其他任意键退出退出系统\n");scanf("%d",&c);if(c==1){for(i=0;i<10;i++){A[i]=rand()%100;}printf("随机产生的数组为:\n");for(i=0;i<10;i++)printf("%3d",A[i]);printf("\n");m=rand()%10;n=rand()%100;printf("随机产生的m=%d\n",m);printf("随机产生的n=%d\n",n);for(i=0;i<10;i++){if(i==m-1){for(i=11;i>=m;i--){A[i]=A[i-1];}A[i]=n;}}printf("插入后的数组为:\n");for(i=0;i<=10;i++)printf("%3d",A[i]);printf("\n");}elsebreak;}return 0;}//选择删除X元素#include <stdio.h>void main(){int i,n,k,m;int a[10] = {4,21,13,34,13,6,7,10,9,10};printf("删除前的数组为:\n");for(i=0;i<10;i++){printf("%d ",a[i]);}printf("\n");printf("请输入要删除的数字:\n");scanf("%d",&n);printf("删除后的数组为:\n");m=10;for(i=0;i<10;i++){if(a[i] == n){m--;for(k=i;k<10;k++){a[k] = a[k+1];}}}for(i=0;i<m;i++)printf("%d ",a[i]);printf("\n");}//输入一个字符组,将其逆置输出#include "stdio.h"void main(){int i=0,k,temp;char str[100]; /* */printf("输入一个字符串:\n");while((str[i]=getchar())!='\n')i++;str[i]='\0';k=i-1;for(i=0;i<k;i++){temp=str[i];str[i]=str[k];str[k]=temp;k--;}for(i=0;str[i]!='\0';i++)putchar(str[i]);printf("\n");}//矩阵任意两行或两列交换#include "stdio.h"int main(){int i,j,m,n,t;int A[4][5]={{1,2,3,4,5},{6,7,8,9,10,},{11,12,13,14,15},{16,17,18,19,20}};int B[4][5]={0};printf("交换前的矩阵为:\n");for(i=0;i<4;i++){for(j=0;j<5;j++)printf("%5d",A[i][j]);printf("\n");}while(1){printf("请选择行交换还是列交换\n*.按1 列交换\n*.按2 行交换\n*.其他任意数退出系统!\n");scanf("%d",&t);if(t==1){printf("请输入要交换的两列:\n");scanf("%d",&m);scanf("%d",&n);for(i=0;i<4;i++){B[i][m-1]=A[i][m-1];A[i][m-1]=A[i][n-1];A[i][n-1]=B[i][m-1];}}else if(t==2){printf("请输入要交换的两行:");scanf("%d",&m);scanf("%d",&n);for(j=0;j<5;j++){B[m-1][j]=A[m-1][j];A[m-1][j]=A[n-1][j];A[n-1][j]=B[m-1][j];}}elsebreak;printf("交换后的数组为:\n");for(i=0;i<4;i++){for(j=0;j<5;j++)printf("%5d",A[i][j]);printf("\n");}}return 0;}/*礼炮问题*/#include"stdio.h"int main(){int t,count;for(t=0,count=0;t<=140;t++)if(t%3==0&&t<=60||t%5==0&&t<=100||t%7==0) count++;printf("所听到的炮声是:%d\n",count);return 0;}//数据结构//增加或删除学生信息#include "stdio.h"struct student{int ID;char name[20];struct{int year,month,day;}birthday;float scores[3];char address[100];};void stud_out(struct student *a,int n);int stud_ins(struct student *a,int n);void stud_del(struct student *a,int *n,int j);int main(){struct student stu[50]={{1001,"李天骄",1990,12,3,87.5,93.6,79.5,"北京联合大学信息学院97号"},{1002,"张璍萸",1991,2,13,97.5,83.6,89.5,"北京联合大学信息学院97号"},{1003,"陈自逸",1989,10,31,77.5,88.6,79.5,"北京联合大学信息学院97号"}};int num=3;int n,k;stud_out(stu,num);while(1){printf("请选择操作内容:1.增加学生;2.删除学生;0.退出系统!\n");if(k==1){num=stud_ins(stu,num);stud_out(stu,num);}else if(k==2){printf("请选择删除第几个学生\n");scanf("%d",&n);stud_del(stu,&num,n);printf("删除第%d个学生后\n",n);stud_out(stu,num);}else{break;}}return 0;}int stud_ins(struct student *a,int n){int i;struct student tmp;printf("输入学号\n");scanf("%d",&tmp.ID);printf("输入姓名\n");fflush(stdin);printf("输入生日(年月日)\n");scanf("%d",&tmp.birthday.year);scanf("%d",&tmp.birthday.month);scanf("%d",&tmp.birthday.day);printf("请输入C实验、C语言理论、C笔试成绩\n");for(i=0;i<3;i++)scanf("%f",&tmp.scores[i]);printf("请输入地址\n");fflush(stdin);scanf("%s",&tmp.address);a[n]=tmp;return n+1;}void stud_del(struct student *a,int *n,int j){int i;for(i=j-1;i<*n-1;i++)a[i]=a[i+1];(*n)--;}void stud_out(struct student *a,int n){int i,k;printf(" 学号姓名生日C实验C理论C笔试地址\n");for(i=0;i<n;i++){printf("%5d",a[i].ID);printf("%7s",a[i].name);printf("%5d",a[i].birthday.year);printf("%3d",a[i].birthday.month);printf("%3d",a[i].birthday.day);for(k=0;k<3;k++)printf("%7.1f",a[i].scores[k]);printf("\t%s",a[i].address);printf("\n");}}//数组元素排序#include"iostream"using namespace std;void sort(int *p,int n);int main(){int a[10]={21,3,45,6,76,9,10,23,22,34};int *p,i;p=a; //将数组a的首地址赋予指针p sort(p,10); //调用排序函数对数组排序for(i=0,p=a;i<10;i++)cout<<*(p++)<<" "; //输出排列后数组cout<<endl;return 0;}void sort(int *p,int n){int i,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(*(p+j)<*(p+k))k=j;if(k!=i){t=*(p+i);*(p+i)=*(p+k);*(p+k)=t;}}}。

基数排序c语言

基数排序c语言

基数排序c语言基数排序是一种非比较排序算法,它按照数据的每个位数进行排序。

这个算法需要有一个用于存储临时数据的辅助数组。

以下是基数排序的C语言实现代码:c获取数组中最大的数int getMax(int arr[], int n) {int max = arr[0];for (int i = 1; i < n; i++)if (arr[i] > max)max = arr[i];return max;}使用计数排序对数组按照指定位进行排序void countSort(int arr[], int n, int exp) {int output[n]; 存储排序结果的临时数组int count[10] = {0}; 用于计数的数组统计每个数字的出现次数for (int i = 0; i < n; i++)count[(arr[i] / exp) % 10]++;计算每个数字在输出数组中的位置for (int i = 1; i < 10; i++)count[i] += count[i - 1];将数字按照指定位数排序到临时数组中for (int i = n - 1; i >= 0; i) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10];}将临时数组的内容拷贝回原数组for (int i = 0; i < n; i++)arr[i] = output[i];}基数排序函数void radixSort(int arr[], int n) {int max = getMax(arr, n);对数组每个位数进行排序for (int exp = 1; max / exp > 0; exp *= 10)countSort(arr, n, exp);}测试代码int main() {int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};int n = sizeof(arr) / sizeof(arr[0]);radixSort(arr, n);printf("排序后的数组:\n");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;}以上代码实现了基数排序算法,通过测试代码可以看到排序结果。

C语言编程练习之数组

C语言编程练习之数组

1.输出整数各位数字本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:输入在一行中给出一个长整型范围内的非负整数。

输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:123456输出样例:1 2 3 4 5 6(1)编程思路。

将一个非负整数number各位上的数字依次分离出来,其操作步骤为:1)分离出number的个位数,即number%10。

2)将number除以10,作为新的number,即新的number丢掉了个位数。

3)如果number等于0,分离完毕,结束。

否则,转第1)步,继续显示。

例如,number=1234,number%10=4,number=1234/10=123,得到数字4;number%10=3,number=123/10=12,得到数字3;number%10=2,number=12/10=1,得到数字2;number%10=1,number=1/10=0,得到数字1;结束。

将分离的各位数字依次存储到数组a中,然后逆序输出数组a中保存的各元素值即可。

(2)源程序。

#include <stdio.h>int main(){long long n;scanf("%lld",&n);int a[20]={0},cnt=0;while (n!=0){a[cnt++]=n%10;n=n/10;}if (cnt==0)printf("0 \n");else{for (int i=cnt-1;i>=0;i--)printf("%d ",a[i]);printf("\n");}return 0;}2.冒泡法排序将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。

c语言选择排序法例题

c语言选择排序法例题

c语言选择排序法例题例:用选择法对10个整数排序。

选择排序的思路为:设有10个元素a[1]~a[10],将a[1]与a[2]~a[10]比较,若a[1]比a[2]~a[10]都小,则不进行交换,即无任何操作。

若a[2]~a[10]中有一个以上比a[1]小,则将其中最大的一个(假设为a[i])与a[1]交换,此时a[1]中存放了10个中最小的数。

第2轮将a[2]与a[3]~a[10]比较,将剩下9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第二小的数。

依此类推,共进行9轮比较,a[1]~a[10]就已按由小到大的顺序存放了。

程序示例:#include<stdio.h>int main(){int i,j,min,temp,a[11];printf("enter data:\n");for(i=1;i<=10;i++){printf("a[%d]=",i);scanf("%d",&a[i]);//输入10个数}printf("\n");printf("The orginal numbers:\n");for(i=1;i<=10;i++)printf("%5d",a[i]);//输出这10个数printf("\n");for(i=1;i<=9;i++) //以下8行是对10个数排序{min=i;for(j=i+1;j<=10;j++)if (a[min]>a[j])min=j;{temp=a[i];//以下3行将a[i+1]~a[10]中的最小值与a[]对换a[i]=a[min];a[min]=temp;}}printf("\nThe sorted numbers:\n"); //输出已排好序的10个数for(i=1;i<=10;i++)printf("%5d",a[i]);printf("\n");return 0;}。

C语言常见排序算法

C语言常见排序算法

49
2 j 49
08
0
25* 3 49 25
16 4
21
5
08
25
25*
16
21
i k 49
j 25* 25
08
25
25*
16
21
6.1.5 选择排序
算法实例:
08 0
25 1 i
49 2
25* 3
16 4 k
21 5 j 21 16
k 指示当前序列中最小者
6.1.5 选择排序
算法实现:
25*
16
21
i=3
08
16
49
25*
25
21
6.1.5 选择排序
算法实例:
08 0
16 1
21 2 21
25*
3 25*
25
4 25 5
最小者 25* 无交换
08
16
最小者 25 49 无交换
08
16
21
25*
25
49
各趟排序后的结果
6.1.5 选择排序
算法实例:
i =2时选择排序的过程
25 1 i k
6.1.5 选择排序

k
k
k
i=1 初始: [ 49 13
38 j k
65
j
97 j
76
j
13 49 j
27 ]
j
排序实例:
k
97 j 97 [97 76 j 76 76 49 38 27 ] j 49 49 j 38 ] 65 ]
i=2 一趟: 13
[38 27 65 j
二趟: 13 三趟: 13

C语言设计题

C语言设计题
序号 题目 把100-300之间的不能被5整除的数输出来(用continue语句),5个一行,每 01 个数占四列宽。 定义一个函数,其返回值为一个整数的因子之和。在主函数中输出1000之内 02 所有的完数。例如,6=1+2+3,因此6是“完数”。 输入一单精度二维数组a[4][3],计算该二维数组中的最大元素的值及其所 03 在位置(行、列),并输出计算结果,输出的结果保留两位小数。 输入x,输出下列函数的值;假设输入4,则输出格式要求如下:x=4.00,f (4.00)=7.00。<br> 04 <img src="wdh/sheji02-01.jpg"> 自定义一个max函数,用于比较两个数的大小;从键盘输入两个数a、b,利 05 用max函数求出两个数中大的,并在屏幕上输出。 编写程序建立一个整型数组,数组元素依次是1,2,3,4,5,6,7,8,9;通过对 06 自定义函数inv的调用,使数组元素依次是9,8,7,6,5,4,3,2,1。 用公式<img src="wdh/sheji03-01.jpg">求e的近似值,直到末项的绝对值 07 小于0.000001。 编写函数,在10个元素的一维数组中,统计比相邻元素大的数组元素个数并 08 将统计数返回主函数输出(不考虑a[0]和a[n-1])。 编程,判断输入的一字符串是否是回文。若是回文则输出YES,否则输出NO 09 。所谓回文是顺读和倒读都一样的字符串。 编程计算下式的值,直到末项与1差的绝对值小于0.000001。<br> 10 <img src="wdh/sheji04-01.jpg"> 输入一个正整数n,求1/1!+1/2!+1/3!+…..+1/n!的值,要求定义并调出函 11 数fact(n)计算n的阶乘,函数返回值的类型是单精度浮点型。 编程,输入一个字符串(少于80个字符),将它的内容颠倒过来再输出。如 12 “ABCD” 颠倒为“DCBA”。 求出1000至2000之内能同时被5、11整除但不能被9整除的数,以十六进制格 13 式输出。 输入一N位整数,要求依次输出该整数的每一位数字,如输入14289,则输出 14 1,4,2,8,9。 自定义一个函数,判断输入的字符是否为英文字母;如果不是字母,函数返 回-1,如果是字母,函数返回值为该字母在字母表中的位置。例如:如果输 入的字母是d或D,程序应该输出4。在主函数中输入一个任意字符,并调用 该自定义函数进行判断。 15 <br> 16 输入x、n,输出<img src="wdh/sheji06-02.jpg">的值。 输入一个字符串,长度不大于80,挑出其中的元音字符和数字,放入另外的 17 两个字符串中。(元音字符为a,e,o,i,u) 求方程<img src="wdh/sheji06-01.jpg">的全部实根,其中a,b,c的值通过 18 键盘输入。 编程计算下列分段函数值,输出格式如下:x=具体值,f(x)=具体值。<br> 19 <img src="wdh\sheji07-01.jpg"> 输入10个学生的数据,包括学号、姓名、3门课程的成绩。求每个学生的平 均分,按照每个学生一行的格式输出数据(包括学号、姓名、3门课成绩、 20 平均分)。用结构体完成。 打印出如下所示的杨辉三角形(要求打印出10行)。<br> 1<br> 1 1<br> 1 2 1<br> 1 3 3 1<br> 1 4 6 4 1<br> 1 5 10 10 5 1<br> 21 …………………<br>

c语言几种数组排序方法

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;}三、快速排序是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

C语言大赛题目精选(带答案)

C语言大赛题目精选(带答案)
for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++){i1=20-8*i8-5*i5-3*i3-2*i2;
term=
2000."0*pow((double)(1+
0."0063*12),(double)i1)
Enter year/month/day:1992 10 25
He was sleeping at day.
Enter year/month/day:1993 10 25
He was sleeping at day
2.
12."抓交通肇事犯
一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:
/*判定year为闰年还是平年,lp=0为平年,非0为闰年*/for(i=1;i<day.month;i++)/*计算本年中自1月1日起的天数*/
day.day+=day_tab[lp];
returnday.day;}*运行结果
Enter year/month/day:1991 10 25
He was fishing at day.
*程序与程序注释
#include<stdio.h>
#include<math.h>
void main(){int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
float max=0,term;
for(i8=0;i8<3;i8++)/*穷举所有可能的存款方式*/

全国计算机二级C语言程序设计题-((-100%全中必过)

全国计算机二级C语言程序设计题-((-100%全中必过)

全国计算机二级C语言程序设计题-((-100%全中必过)目录题目一“回文”字符串 (3)题目二迭代法求给定多项式的值 (4)题目三迭代法求给定方程的根 (4)题目四二维数组三角元素操作1 (5)题目四二维数组三角元素操作2 (6)题目四二维数组三角元素操作3 (7)题目五二维数组元素求最值 (8)题目六二维数组周边元素1 (8)题目六二维数组周边元素2 (9)题目七二维数组转一维数组1 (10)题目七二维数组转一维数组2 (11)题目七二维数组转一维数组3 (12)题目七二维数组转一维数组4 (13)题目八结构体数组排序1 (14)题目八结构体数组排序2 (14)题目八结构体数组排序3 (15)题目八结构体数组排序4 (16)题目九结构体数组求最值1 (17)题目九结构体数组求最值2 (18)题目九结构体数组求最值3 (18)题目九结构体数组求最值4 (19)题目十结构体数组筛选 (19)题目十一结构体数组字符串比较 (20)题目十二矩阵操作1 (21)题目十二矩阵操作2 (22)题目十三类似素数判断1 (23)题目十三类似素数判断2 (23)题目十四累加累乘求和1 (23)题目十四累加累乘求和2 (24)题目十四累加累乘求和3 (24)题目十四累加累乘求和4 (25)题目十四累加累乘求和5 (25)题目十四累加累乘求和6 (26)题目十四累加累乘求和7 (27)题目十四累加累乘求和8 (27)题目十四累加累乘求和9 (28)题目十四累加累乘求和10 (28)题目十四累加累乘求和11 (29)题目十四累加累乘求和12 (29)题目十四累加累乘求和13 (30)题目十四累加累乘求和14 (30)题目十四累加累乘求和15 (31)题目十四累加累乘求和16 (31)题目十五链表1 (32)题目十五链表2 (33)题目十六删除整数位某数位 (34)题目十七删除字符串中指定字符1 (34)题目十七删除字符串中指定字符2 (35)题目十七删除字符串中指定字符3 (35)题目十七删除字符串中指定字符4 (36)题目十七删除字符串中指定字符5 (36)题目十七删除字符串中指定字符6 (37)题目十七删除字符串中指定字符7 (37)题目十七删除字符串中指定字符8 (38)题目十七删除字符串中指定字符9 (38)题目十七删除字符串中指定字符10 (39)题目十七删除字符串中指定字符11 (39)题目十七删除字符串中指定字符12 (40)题目十七删除字符串中指定字符13 (41)题目十七删除字符串中指定字符14 (41)题目十七删除字符串中指定字符15 (42)题目十七删除字符串中指定字符16 (43)题目十七删除字符串中指定字符17 (43)题目十七删除字符串中指定字符18 (44)题目十八数字字符串转整数1 (45)题目十八数字字符串转整数2 (45)题目十九素数判定1 (46)题目十九素数判定2 (46)题目十九素数判定3 (47)题目二十统计问题 (48)题目二十一小数位操作 (48)题目二十二一维数组或字符串排序1 (49)题目二十二一维数组或字符串排序2 (50)题目二十二一维数组元素的筛选1 (50)题目二十二一维数组元素的筛选2 (51)题目二十二一维数组元素的筛选3 (51)题目二十二一维数组元素的筛选4 (52)题目二十二一维数组元素的筛选5 (52)题目二十二一维数组元素的筛选6 (53)题目二十二一维数组元素的筛选7 (54)题目二十二一维数组元素的筛选8 (54)题目二十二一维数组元素的筛选9 (55)题目二十三一维数组元素筛选 (55)题目二十五一维数组最值求解1 (56)题目二十五一维数组最值求解2 (57)题目二十五一维数组最值求解3 (57)题目二十六移动问题1 (58)题目二十六移动问题2 (58)题目二十七整数合并1 (59)题目二十七整数合并2 (59)题目二十七整数合并3 (60)题目二十七整数合并4 (60)题目二十七整数合并5 (60)题目二十七整数合并6 (61)题目二十七整数合并7 (61)题目二十七整数合并8 (62)题目二十八字符串长度比较1 (62)题目二十八字符串长度比较2 (62)题目二十九字符串的逆置 (63)题目三十字符串计数 (64)题目三十一字符串连接1 (64)题目三十一字符串连接2 (65)题目三十一字符串连接3 (66)题目三十二字符串中指定字符查找 (66)题目三十三字母大小的判断及转换 (67)题目一“回文”字符串3.请编写函数fun,该函数的功能是:判断字符串是否为回文,若是,则函数返回1,主函数中输出"YES",否则返回0,主函数中输出"NO"。

C语言排序算法

C语言排序算法

i=2
49 25* 16 08 2 3 4 5
49
i=3
21
0
25 1
49 25* 16 2 3 4
08 5
25*
6.1.3 直接插入排序
实用例子:
i=4
21 25 25* 49 16 08 0 1 2 3 4 21 25 25* 49 08 1 2 3 4
16 5 temp
i= 5 完成
16 0
49
2 j 49
08
0
25* 3 49 25
16 4
21
5
08
25
25*
16
21
i k 49
j 25* 25
08
25
25*
16
21
6.1.5 选择排序
算法实例:
08 0
25 1 i
49 2
25* 3
16 4 k
21 5 j 21 16
k 指示当前序列中最小者
6.1.5 选择排序
算法实现:
49 49
25 25
16
21
low
25*
high
6.1.2 快速排序
算法实例:
完成一趟排序 08 16 21 25* 49 25
分别进行快速排序
08
16
21
25*
25
49
有序序列 08 16 21 25* 25 49
10
6.1.2 快速排序
算法分析:
快速排序是一个递归过程; 利用序列第一个记录作为基准,将整个序列划分为左右两个子序列。只要 是关键字小于基准记录关键字的记录都移到序列左侧;
快速排序的趟数取决于递归树的高度。

简单选择排序C语言实现

简单选择排序C语言实现

简单选择排序C语言实现简单选择排序(C语言实现)导语:C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

下面我们来看看简单选择排序(C语言实现),希望对大家有所帮助。

简单选择排序的算法实现思想是:第一趟,从n个记录当真找出关键字最小的.记录与第一个记录交换;第二趟,从第二个记录开始的n-1个记录中找出关键字最小的记录与第二个记录交换;依次类推,直到整个序列按照关键字有序。

下面实现一个简单的选择排序函数(按照逐渐递增方式进行排序):/* 选择排序算法的实现* array[] : 待排序的数组* length : 待排序的数组的长度*/void selection_sort(int array[], int length){int i, j, m;int temp; // 用于存放临时待排序的元素值for(i = 0; i < length -1; i++){m = i;for(j = i + 1; j < length; j++){if(array[j] < array[m])m = j;}if(m != i){temp = array[i];array[i] = array[m];array[m] = temp;}}}测试程序实现如下:/* 程序的入口函数 */int main(){int a[ARRAY_LENGTH];int i;/* 输入10个整形元素 */printf("Input %d numbers : ", ARRAY_LENGTH);for(i = 0; i < ARRAY_LENGTH; i++){scanf("%d", &a[i]);}printf("******************************************************* ********* ");/* 把排序前元素都打印出来 */printf("The elements before sort is : ");for(i = 0; i< ARRAY_LENGTH; i++){printf("%d ", a[i]);}printf(" ");printf("******************************************************* ********* ");/* 对元素进行有小到大的顺序进行排序 */selection_sort(a, ARRAY_LENGTH); /* 把排序后元素都打印出来 */printf("The elements after sort is : "); for(i = 0; i < ARRAY_LENGTH; i++) {printf("%d ", a[i]);}printf(" ");return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

92.下列程序的功能是:将一正整数序列{K1,K2,…,K9}重新排成一个新的序列。

新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描。

要求编写函数jsValue()实现此功能,最后调用函数writeDat()把新序列输出到文件OUT.DAT中。

说明在程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。

例如:序列排序前{6,8,9,1,2,5,4,7,3}
序列排序后{3,4,5,2,1,6,8,9,7}
注意:部分源程序存放在PROG1.C中。

请勿改动主函数main()和写函数writeDat()的内容。

【试题程序】
#include <stdio.h>
void writeDat();
void jsValue(int a[10][9])
{
}
void main()
{
int a[10][9]={{6,8,9,1,2,5,4,7,3},
{3,5,8,9,1,2,6,4,7},
{8,2,1,9,3,5,4,6,7},
{3,5,1,2,9,8,6,7,4},
{4,7,8,9,1,2,5,3,6},
{4,7,3,5,1,2,6,8,9},
{9,1,3,5,8,6,2,4,7},
{2,6,1,9,8,3,5,7,4},
{5,3,7,9,1,8,2,6,4},
{7,1,3,2,5,8,9,4,6},
};
int i,j;
jsValue(a);
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
if(j<=7) printf(","); }
printf("
) \n"
}
writeDat(a);
}
void writeDat(int a[10][9])
{
FILE *fp;
int i,j;
fp=fopen("OUT.DA T","w");
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
fprintf(fp,"%d",a[i][j]);
if(j<=7)
fprintf(fp,",");
}
fprintf(fp,"\n");
}
fclose(fp);
}
【解题思路】此题属于排序问题。

通过对问题的分析,得出解本题的思路为:利用嵌套的循环实现对二维数组每个元素的访问,对于每一行,将第1个数取出依次同后面的数进行比较,后面的数如果更小,则将后面的数取出,将这个数据左侧的数依次向右移动,然后将这个数放在最左侧。

这样,扫描完一行后,比第1个数小的数就在第1个数的左侧,而比它大的数则在其右侧。

【参考答案】
void jsValue(int a[10][9])
{ int i,j,k; /*循环控制变量*/
int num,temp; /*定义暂存变量*/
for(i=0;i<10;i++) /*逐行取数进行处理*/
{
num=a[i][0]; /*暂存一行的第一个元素*/
for(j=0;j<9;j++) /*每行的所有元素*/
if(a[i][j]<num) /*若后面的数中有比第1个数据小的数*/ {
temp=a[i][j]; /*则把这个数取出,赋给num*/
for(k=j;k>0;k--) /*将这个数据左侧的数依次向右移动*/
a[i][k]=a[i][k-1];
a[i][0]=temp; /*再将这个数放在最左侧*/
}
}
}。

相关文档
最新文档