1、最大与次大值
题目内容:编写程序,找出给定的n个数中的最大值及次大值。
输入格式:在第一行中输入一个正整数n(1<n≤10)。第二行输入n个整数,用英文逗号,隔开。
输出格式:在一行中输出最大值及次大值,中间用英文逗号,隔开。
输入样例:7
12,1,2,5,4,7,3
输出样例:12,7
1 /*
2 求最大值、次大值可以不用排序
3 */
4 #include <stdio.h>
5 #define N 100
6 int main()
7 {
8 int n, a[N] = {0};
9 scanf("%d",&n);
10 for(int i=0; i<n-1; ++i){
11 scanf("%d,",&a[i]);
12 }
13 scanf("%d",&a[n-1]);
14 /* 只一个元素最大次大相同 */
15 int max1 = a[0], max2 = a[0];
16 a[1] > max1 ? max1 = a[1] : max2 = a[1];
17 for(int k=2; k<n; ++k){
18 if(a[k]>max1){
19 max2 = max1;
20 max1 = a[k];
21 }
22 else if(a[k]>max2){
23 max2 = a[k];
24 }
25 }
26 printf("%d,%d\n",max1, max2);
27 return 0;
28 }
1 /*
2 与只求最大值的程序一样吗,
3 好像是, 可以排序。
4 */
5 #include <stdio.h>
6 #define N 100
7 int main()
8 {
9 int n, a[N] = {0};
10 scanf("%d",&n);
11 for(int i=0; i<n-1; ++i){
12 scanf("%d,",&a[i]);
13 }
14 scanf("%d",&a[n-1]);
15 /* 插入排序 */
16 for(int i = 0; i<n; ++i){
17 int min = a[i];
18 int index = i;
19 for(int j = i+1; j<n; ++j){
20 if(min>a[j]){
21 min = a[j];
22 index = j;
23 }
24 }
25 if(index != i){
26 a[index] = a[i];
27 a[i] = min;
28 }
29 }
30 printf("%d,%d\n",a[n-1],a[n-2]);
31 return 0;
32 }
2、素数排序
题目内容:输入10个正整数到a数组中,对a[10]数组中的素数升序排序。
输入格式:在一行中输入10个用英文逗号,隔开的正整数。
输出格式:在一行中输出升序的素数序列,每个数之间用英文逗号,隔开,末尾没有多余的空格。
输入样例:10,3,1,5,4,8,7,2,9,11
输出样例:2,3,5,7,11
输入样例:16,12,1,6,4,8,14,18,24,21
输出样例:Not found!
1 /* */
2 #include <stdio.h>
3 #define N 100
4 /* 判断素数 */
5 int isPrime(int key)
6 {
7 if(key<2)
8 return 0;
9 for(int i=2; i<key; ++i)
10 if(key%i==0)
11 return 0;
12 return 1;
13 }
14 /* 升序插入 */
15 void InsertArr(int *arr, int n, int key)
16 {
17 int j=n;
18 while(j>=0 && key>arr[j]){
19 arr[j+1]=arr[j];/*移动,向后赋值*/
20 j--;
21 }
22 arr[j+1]=key;/**/
23 }
24 int main()
25 {
26 int n=0, arr[N] = {0},a[N] = {0};
27
28 for(int i=0; i<9; ++i){
29 scanf("%d,",&a[i]);
30 if(isPrime(a[i])){
31 InsertArr(arr,n,a[i]);
32 n++;
33 }
34 }
35 scanf("%d",&a[9]);
36 if(isPrime(a[9])){
37 InsertArr(arr,n,a[9]);
38 n++;
39 }
40 if(n==0)
41 printf("Not found!");
42 else{
43 for(int i=n-1; i>0; --i){
44 printf("%d,",arr[i]);
45 }
46 printf("%d",arr[0]);
47 }
48 return 0;
49 }
3、循环右移
题目内容:一个数组A中存有N>0个整数,将每个整数循环向右移M≥0个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。
输入格式:第1行输入N(1≤N≤100)和M(≥0)中间用英文逗号,分隔第2行输入N个整数,中间用英文 逗号,分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,中间用英文逗号,分隔,序列结尾不能有多余空格。
输入样例:7,3
1,2,3,4,5,6,7
输出样例:5,6,7,1,2,3,4
输入样例:7,0
1,2,3,4,5,6,7
输出样例:1,2,3,4,5,6,7
1 #include <stdio.h>
2 #define N 100
3
4 /* 头插入 */
5 void InsertHead(int *arr, int index, int key)
6 {
7 for(int j=index-1; j>=0; j--){
8 arr[j+1]=arr[j];/*移动*/
9 }
10 arr[0]=key;
11 }
12 int main()
13 {
14 int n, m, arr[N] = {0};
15 scanf("%d,%d",&n,&m);
16
17 for(int i=0; i<n-1; ++i){
18 scanf("%d,",&arr[i]);
19 }
20 scanf("%d",&arr[n-1]);
21
22 while(m--)
23 InsertHead(arr,n-1,arr[n-1]);
24
25 for(int i=0; i<n-1; ++i){
26 printf("%d,",arr[i]);
27 }
28 printf("%d",arr[n-1]);
29 return 0;
30 }
1 /* 算法2 整体右移动m位, 右m位全部移动到数组左边 */
2 #include <stdio.h>
3 #define N 100
4
5 int main()
6 {
7 int n, m, arr[N] = {0};
8 scanf("%d,%d",&n,&m);
9
10 for(int i=0; i<n-1; ++i){
11 scanf("%d,",&arr[i]);
12 }
13 scanf("%d",&arr[n-1]);
14 /* 1.数组整体向右移动m位 */
15 for(int i=n-1; i>=0; --i)
16 arr[i+m] = arr[i];
17 /* 2.右m位全部移动到数组左边 */
18 for(int i=0; i<m; ++i)
19 arr[i] = arr[i+n];
20
21 for(int i=0; i<n-1; ++i){
22 printf("%d,",arr[i]);
23 }
24 printf("%d",arr[n-1]);
25 return 0;
26 }
1 /* 算法3 置换圈 */
2 #include <stdio.h>
3 #define N 100
4 int gcd(int n, int m)//最大公约数
5 {
6 while(n)
7 {
8 int r = m%n;
9 m = n;
10 n = r;
11 }
12 return m;
13 }
14 int main()
15 {
16 int n, m, arr[N] = {0};
17 scanf("%d,%d",&n,&m);
18
19 for(int i=0; i<n-1; ++i){
20 scanf("%d,",&arr[i]);
21 }
22 scanf("%d",&arr[n-1]);
23
24 int count = gcd(n,m);//圈数(最大公约数)
25 int length = n / count; //圈长度
26 for(int i=0; i<count; ++i)//循环处理count圈
27 {
28 int t = arr[i]; //圈头元素
29 int start = i; //圈头下标
30 int end = (start-m+n)%n;//圈尾下标
31 for(int j=1; j<length; j++)//圈内移位
32 {
33 arr[start] = arr[end];
34 start = end;
35 end = (end-m+n)%n;
36 }
37 arr[start] = t;//圈头元素就位
38 }
39
40 for(int i=0; i<n-1; ++i){
41 printf("%d,",arr[i]);
42 }
43 printf("%d",arr[n-1]);
44 return 0;
45 }
1 /* 算法4 逆序 */
2 #include <stdio.h>
3 #define N 100
4 /* 逆序 */
5 void reverse(int* arr, int left, int right)
6 {
7 while(left<right)
8 {
9 int t = arr[left];
10 arr[left] = arr[right];
11 arr[right] = t;
12 left++, right--;
13 }
14 }
15 int main()
16 {
17 int n, k, arr[N] = {0};
18 scanf("%d,%d",&n,&k);
19 /* 输入数组 */
20 for(int i=0; i<n-1; ++i){
21 scanf("%d,",&arr[i]);
22 }
23 scanf("%d",&arr[n-1]);
24 /* 1.将数组分成两段,左段长为n-k,右段长为k
25 分别将两段逆转(即元素排列次序与原次序相反) */
26 reverse(arr,0,n-k-1);
27 reverse(arr,n-k,n-1);
28 /* 2.再数组元素整体逆转 */
29 reverse(arr,0,n-1);
30 /* 打印 */
31 for(int i=0; i<n-1; ++i){
32 printf("%d,",arr[i]);
33 }
34 printf("%d",arr[n-1]);
35 return 0;
36 }
1 /* 算法5.辅助数组 */
2 #include <stdio.h>
3 #define N 100
4 int main()
5 {
6 int n, k, arr1[N] = {0},arr2[N] = {0};
7 scanf("%d,%d",&n,&k);
8 /* 输入数组 */
9 for(int i=0; i<n-1; ++i){
10 scanf("%d,",&arr1[i]);
11 }
12 scanf("%d",&arr1[n-1]);
13 /* 复制 */
14 for(int i=0; i<n; ++i){
15 arr2[i] = arr1[(i-k+n)%n];//左移arr1[(i+k)%n];
16 }
17 /* 打印 */
18 for(int i=0; i<n-1; ++i){
19 printf("%d,",arr2[i]);
20 }
21 printf("%d",arr2[n-1]);
22 return 0;
23 }
1 /* 算法6.循环队列理论,直接输出 */
2 #include <stdio.h>
3 #define N 100
4 int main()
5 {
6 int i, n, k, arr[N] = {0};
7 scanf("%d,%d",&n,&k);
8 /* 输入数组 */
9 for(int i=0; i<n-1; ++i){
10 scanf("%d,",&arr[i]);
11 }
12 scanf("%d",&arr[n-1]);
13
14 /* 打印 */
15 for(i=0; i<n-1; ++i){
16 printf("%d,",arr[(i-k+n)%n]);
17 }
18 printf("%d",arr[(i-k+n)%n]);
19 return 0;
20 }
4、爬楼梯
题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。
输入格式:输入一个整数n,(1<=n<46)。
输出格式:输出当楼梯阶数是n时的上楼方式总数。
输入样例:1
输出样例:1
输入样例:4
输出样例:7
输入样例:24
输出样例:1389537
1 #include <stdio.h>
2
3 double fun(int n){
4 if(n==1)
5 return 1;
6 else if(n==2)
7 return 2;
8 else if(n==3)
9 return 4;
10 return fun(n-1) + fun(n-2)+ fun(n-3);
11 }
12
13 int main()
14 {
15 int n;
16 scanf("%d",&n);
17 printf("%.f",fun(n));
18 return 0;
19 }
5、三天打鱼两天晒网
题目内容:中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?
输入样例:1990-1-3
输出样例:他在打鱼
输入样例:2018-11-13
输出样例:他在晒网
1 #include<stdio.h>
2 int inputdate();
3 int main()
4 {
5 int n = inputdate();
6 /* if(-1==n){
7 printf("Invalid input");
8 }
9 else */
10 if(n%5==0||n%5==4){
11 printf("他在晒网");
12 }
13 else{
14 printf("他在打鱼");
15 }
16
17 return 0;
18 }
19 int inputdate()
20 {
21 int year,month,day;
22 int n = scanf("%4d-%2d-%2d",&year,&month,&day);
23 /* if(3 != n||year<1990||month>12||month<=0||day>31||day<=0){
24 return -1;
25 } */
26
27 int date[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
28 {31,29,31,30,31,30,31,31,30,31,30,31}};
29
30 int sum = 0, flag =(year%4==0&&year%100!=0)||(year%400==0);
31 for(int i=0;i<month-1;++i){
32 sum +=date[flag][i];
33 }
34
35 return sum+day;
36 }
6、时间换算
题目内容:编写程序,实现输入的时间,屏幕显示一秒后的时间。显示格式为HH:MM:SS。
程序需要处理以下三种特殊情况:
(1)若秒数加1后为60,则秒数恢复到0,分钟数增加1;
(2)若分钟数加1后为60,则分钟数恢复到0,小时数增加1;
(3)若小时数加1后为24,则小时数恢复到0。
输入样例:18:1:2
输出样例:18:01:03
输入样例:20:12:59
输出样例:20:13:00
输入样例:23:59:59
输出样例:00:00:00
1 #include<stdio.h>
2 void run();
3 int main()
4 {
5 run();
6
7 return 0;
8 }
9 void run()
10 {
11 int h,m,s;
12 scanf("%d:%d:%d",&h,&m,&s);
13
14 s++;
15 if(s==60){
16 s=0;
17 m++;
18 }
19 if(m==60){
20 m=0;
21 h++;
22 }
23 if(h==24){
24 h=0;
25 }
26 printf("%02d:%02d:%02d\n",h,m,s);
27 }
7、正向建立单链表
题目内容:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立单链表并输出。
输入格式:一行内输入若干个正整数,之间用空格隔开,并以-1结束。
输出格式:一行内输出建立的单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
输入样例:2 4 6 8 10 -1
输出样例:--2--4--6--8--10
1 #include <stdio.h>
2 #include <malloc.h>
3 typedef struct node NODE;
4 typedef struct node* Linklist;
5 struct node{
6 int data;
7 Linklist next;
8 };
9 /*
10 //头插法(输入与输出是逆序)
11 Linklist create(){
12 Linklist L,p;
13 L = p = (Linklist)malloc(sizeof(NODE));
14 L->next = NULL;
15 int x;
16 scanf("%d",&x);
17 while(x!=-1)
18 {
19 p = (Linklist)malloc(sizeof(NODE));
20 p->data = x;
21 p->next = L->next;
22 L->next = p;
23 scanf("%d",&x);
24 }
25 return L;
26 } */
27 // 尾插法(输入与输出正序)
28 Linklist create(){
29 Linklist L,p,r;
30 L = r = (Linklist)malloc(sizeof(NODE));
31 L->next = NULL;
32 int x;
33 scanf("%d",&x);
34 while(x!=-1)
35 {
36 p = (Linklist)malloc(sizeof(NODE));
37 p->data = x;
38 p->next = NULL;
39 r->next = p;
40 r = p;
41 scanf("%d",&x);
42 }
43 return L;
44 }
45 void print(Linklist L){
46 while(L->next)
47 {
48 L = L->next;
49 printf("--%d",L->data);
50 }
51 }
52 int main()
53 {
54 Linklist L = create();
55 print(L);
56 return 0;
57 }
8、逆置单链表
题目内容:一个单链表L=(a1 , a2 , … , an-1 , an),其逆单链表定义为L’=( an , an-1 , … , a2 , a1),编写算法将单链表L逆置,要求逆单链表仍占用原单链表的空间。
输入格式:一行内输入原单链表中的数据(若干个正整数,之间用空格隔开,并以-1结束)
输出格式:一行内输出建立的原单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
下一行内输出逆置后的单链表数据结果,之间用两个分隔符 -- 隔开。
输入样例:2 4 6 8 10 -1
输出样例:--2--4--6--8--10
--10--8--6--4--2
1 #include <stdio.h>
2 #include <malloc.h>
3 typedef struct node NODE;
4 typedef struct node* Linklist;
5 struct node{
6 int data;
7 Linklist next;
8 };
9 void reverse(Linklist L)
10 {
11 Linklist NEW = NULL, CUR = L->next, TEMP;
12 while(CUR)//是否空
13 {
14 TEMP = CUR->next;//保存新表的当前指针的前驱指针(无前驱为NULL)
15 CUR->next = NEW;// 逆序(NEW为新表当前CUR的后继指针)
16 NEW = CUR;//更新新表后继指针
17 CUR = TEMP;//更新新表当前指针
18 }
19 L->next = NEW;//逆序的头指针插入头结点
20 }
21 Linklist create()
22 {
23 Linklist L,p,r;
24 L = r = (Linklist)malloc(sizeof(NODE));
25 L->next = NULL;
26 int x;
27 scanf("%d",&x);
28 while(x!=-1)
29 {
30 p = (Linklist)malloc(sizeof(NODE));
31 p->data = x;
32 p->next = NULL;
33 /* ---------- */
34 r->next = p;//尾插
35 r = p; //更新尾指针
36 scanf("%d",&x);
37 }
38 return L;
39 }
40 void print(Linklist L)
41 {
42 while(L->next)
43 {
44 L = L->next;
45 printf("--%d",L->data);
46 }
47 printf("\n");
48 }
49 int main()
50 {
51 Linklist L = create();
52 print(L);
53 reverse(L);//逆序
54 print(L);
55 return 0;
56 }
9、链表合并
题目内容:已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,要求新表 LC利用原表的存储空间。
LC=(a1,b1,…,am,bm,bm+1,…,bn),m<=n
或者
LC=(a1,b1,…,an,bn,an+1,…,am),m>n
输入格式:一行内输入单链表LA中的数据(若干个正整数,之间用空格隔开,并以-1结束)
一行内输入单链表LB的数据(若干个正整数,之间用空格隔开,并以-1结束)
输出格式:一行内输出合并后单链表LC的数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
输入样例:1 3 5 7 -1
2 4 6 -1
输出样例:--1--2--3--4--5--6--7
1 #include <stdio.h>
2 #include <malloc.h>
3 typedef struct node NODE;
4 typedef struct node* Linklist;
5 struct node{
6 int data;
7 Linklist next;
8 };
9 Linklist mergelist(Linklist LA,Linklist LB)
10 {
11 /*
12 LA的头指针为新链表的头、尾指针
13 LB的头结点释放
14 */
15 Linklist head = LA,rear = LA,temp = LB;
16 LA = LA->next;
17 LB = LB->next;
18 free(temp);
19 /* 逐个结点链接到新链表 */
20 while(LA && LB)
21 {
22 /* 先插LA再插LB */
23 if(LA)
24 {
25 rear->next = LA;//尾插结点
26 rear = rear->next;//更新尾结点
27 LA = LA->next;
28 }
29 if(LB)
30 {
31 rear->next = LB;//尾插结点
32 rear = rear->next;//更新尾结点
33 LB = LB->next;
34 }
35 }
36 if(LA)
37 rear->next = LA;//尾插剩余结点
38 if(LB)
39 rear->next = LB;
40 return head;
41 }
42 Linklist create(){
43 Linklist L,p,r;
44 L = r = (Linklist)malloc(sizeof(NODE));
45 L->next = NULL;
46 int x;
47 scanf("%d",&x);
48 while(x!=-1)
49 {
50 p = (Linklist)malloc(sizeof(NODE));
51 p->data = x;
52 p->next = NULL;
53 r->next = p;
54 r = p;
55 scanf("%d",&x);
56 }
57 return L;
58 }
59 void print(Linklist L){
60 while(L->next)
61 {
62 L = L->next;
63 printf("--%d",L->data);
64 }
65 printf("\n");
66 }
67 int main()
68 {
69 Linklist L1 = create();
70 Linklist L2 = create();
71 Linklist L3 = mergelist(L1,L2);
72 print(L3);
73 return 0;
74 }
10、求2~2000的所有素数.有足够的内存,要求尽量快
1 #include <stdio.h>
2 #include <assert.h>
3 /* 素数集合 */
4 int findvalue[2000];
5 static int find;/*素数集合下标从0开始*/
6 bool adjust(int value)
7 {
8 assert(value>=2);/* value>=2 */
9 if(value==2) return true;
10 /* 被素数整除的不是素数 */
11 for(int i=0;i<=find;i++)
12 {
13 if(value%findvalue[i]==0)
14 return false;
15 }
16 findvalue[find++];
17 return true;
18 }
19 int main()
20 {
21 /* 测试, 2~100中的素数集合 */
22 for(int i=2; i<100; ++i)
23 if(adjust(i))
24 findvalue[find] = i;
25 /* 打印素数集合 */
26 for(int j=0;findvalue[j]; ++j)
27 printf("%d ",findvalue[j]);
28 return 0;
29 }
11、计算器
输入一个四则运算算式,运算符为+、-、*、/,操作数为实型数据,对于除法算式,除数不为0,输出算式中的操作数要求保留小数点后两位。
[测试输入1]1.2+3.4
[测试输出1]1.20+3.40=4.60
[测试输入2]2.5*2
[测试输出2]2.50*2.00=5.00
1 #include <stdio.h>
2 #define N 100
3 int main()
4 {
5 double a,b;
6 char op;
7 scanf("%lf %c%lf",&a,&op,&b);
8 double result=0;
9 switch(op){
10 case '+':result = a+b;break;
11 case '-':result = a-b;break;
12 case '*':result = a*b;break;
13 case '/':result = a/b;break;
14 }
15 printf("%.2f%c%.2f=%.2f\n",a,op,b,result);
16 return 0;
17 }
12、日期合法性判定
从键盘输入一个8位整数表示的日期(即yyyymmdd,表示yyyy年mm月dd日),判断该日期是否为合法日期。
[输入样例] 19990101
[输出样例] 1999年1月1日是合法日期
[输入样例] 19361321
[输出样例] 1936年13月21日是非法日期
[输入样例] 19780431
[输出样例] 1978年4月31日是非法日期
[输入样例] 20000229
[输出样例] 2000年2月29日是合法日期
[输入样例] 21000229
[输出样例] 2100年2月29日是非法日期
[输入样例] 19980229
[输出样例] 1998年2月29日是非法日期
1 #include <stdio.h>
2 #define N 100
3 int main()
4 {
5 int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
6 int y,m,d,flag =0;
7 scanf("%4d%2d%2d",&y,&m,&d);
8 int leapyear = y%4==0&&y%100!=0||y%400==0;
9 if(leapyear) arr[2]++;
10 if(m<=12&&m>=1&&d<=arr[m]&&d>=1)
11 flag = 1;
12 printf("%d年%d月%d日",y,m,d);
13 if(flag)
14 printf("是合法日期");
15 else
16 printf("是非法日期");
17 return 0;
18 }
13、求完数
一个正整数如果恰好等于它的因子之和,这个数就称为“完数”,编程找出X之内(包含X)的所有完数并从小到大依次输出各个完数,以空格间隔。例如:6=1+2+3,所以6就是完数。
[样例输入] 100
[样例输出] 6 28
[样例输入] 1000
[样例输出] 6 28 496
1 #include<stdio.h>
2 int fun(int i)
3 {
4 int sum=0,t = i-1;
5 while(t)
6 {
7 if(i%t==0)
8 sum += t;
9 t--;
10 }
11 if(sum==i) return 1;
12 return 0;
13 }
14
15 int main()
16 {
17 int n,flag=0;
18 scanf("%d",&n);
19
20 for(int i=6;i<=n;++i)
21 {
22 if(fun(i)){
23 if(flag) printf(" ");
24 printf("%d",i);
25 flag = 1;
26 }
27 }
28 return 0;
29 }
14、生日蜡烛
[题目描述] 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了N根蜡烛。
请问,他从多少岁开始办生日party的,现在他多少岁?
例如:若N=236,因为236=26+27+28+29+30+31+32+33,所以,他从26岁开始办生日party,他现在33岁。
[输入说明] 输入一共吹熄的蜡烛数N。
[输出说明] 输出他办生日party的起止年龄数,以空格隔开;若有多种情况,输出起始年龄最小的一种情况。
[样例输入] 236
[样例输出] 26 33
[样例输入] 186
[样例输出] 10 21
1 #include<stdio.h>
2 void fun(int n, int *s,int *e){
3 for(int i=1;i<=100;++i)
4 {
5 int sum=0;
6 for(int j=i; j<=100; ++j){
7 sum += j;
8 if(sum==n){
9 *s=i;
10 *e=j;
11 return;
12 }
13 }
14 }
15 }
16 int main()
17 {
18 int n,s,e;
19 scanf("%d",&n);
20 fun(n,&s,&e);
21 printf("%d %d",s,e);
22 return 0;
23 }
15、整数排序
[题目描述] 从键盘输入n个整数,将其从小到大进行排序,并将排序后的结果输出。特别说明:待排序的整数的个数不超过20个。
[输入说明] 第一行为n值,第二行输入n个整数,以空格间隔。
[输出说明] 输出的数据用空格隔开。
[样例输入]
5
5 6 1 2 3
[样例输出]
1 2 3 5 6
1 /*快速排序*/
2 #include <stdio.h>
3 void QuickSort(int *a,int n, int left, int right)
4 {
5 int i,j,t;
6 /*左指针left指向数组头 右指针right指向数组尾*/
7 if(left<right){
8 i=left,j=right+1;/*左右指针*/
9 while(i<j){
10 while(i+1<n && a[++i]<a[left]);/*左指针右移 指向大于基数的数据停止*/
11 while(j-1>-1 && a[--j]>a[left]);/*右指针左移 指向小于基数的数据停止*/
12 if(i<j)/*满足左指针小于右指针的条件 两指针指向数据交换*/
13 t=a[i],a[i]=a[j],a[j]=t;
14 }
15 t=a[left],a[left]=a[j],a[j]=t;/*右指针指向数据与基数交换*/
16 QuickSort(a,n,left,j-1);/*左边数据递归*/
17 QuickSort(a,n,j+1,right);/*右边数据递归*/
18 }
19 }
20
21 int main()
22 {
23 int i,n, arr[20]={0};
24 scanf("%d",&n);
25 for(i=0; i<n; ++i)
26 scanf("%d",&arr[i]);
27 QuickSort(arr,n,0,n-1);
28 for(i=0; i<n; ++i)
29 printf("%d ",arr[i]);
30 return 0;
31 }

1万+

被折叠的 条评论
为什么被折叠?



