1.直接插入排序
/*Description
有n个整数,请使用插入排序算法对其排序,并输出经过m趟排序后的序列(按从小到大排序)。
Input
测试数据有多组,每组的第一行是两个正整数n和m,其中2<=n<=20,0<m<=n-1,
第二行是n个整数,所有数据之间均用空格分隔。
Output
对于每组测试数据,输出单独的一行,对这n个整数进行m趟插入排序后的结果。
数据之间用一个空格分隔。
Sample Input
10 1
9 8 7 6 5 4 3 2 1 0
10 2
9 8 7 6 5 4 3 2 1 0
Sample Output
8 9 7 6 5 4 3 2 1 0
7 8 9 6 5 4 3 2 1 0*/
#define M 2
#define N 10
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int m;
int n;
int a[N];
struct LNode *next;
}*LinkList,LNode;
int main()
{
LinkList head,p1,p2;
LinkList p[M];
int m,n,i,j,t,k;
for(i = 0;i < M;i++)
{
p1 = (LinkList)malloc(sizeof(LNode));
scanf("%d %d",&p1->m,&p1->n);
for(j = 0;j < p1->m;j++)
{
scanf("%d",&p1->a[j]);
if(j == 0) head = p1;
else p2->next = p1;
p2 = p1;
}
p2->next = NULL;
//直接插入开始
for(j = 1;j <= p1->n;++j)
{
if(p1->a[j] < p1->a[j - 1])
{
t = p1->a[j];
p1->a[j] = p1->a[j - 1];
for(k = j - 2;t < p1->a[k];--k)
p1->a[k + 1] = p1->a[k];
p1->a[k + 1] = t;
}
}
p[i] = head;
}
for(i = 0;i < M;i++)
{
head = p[i];
for(j = 0;j < head->m;j++)
printf("%d ",head->a[j]);
printf("\n");
}
}
2.冒泡排序
/*Description
有n个整数,请使用冒泡排序算法对其从小到大排序,输出第m趟排序的结果。
Input
测试数据有多组,每组的第一行是两个正整数n和m,其中2<=n<=20,0<m<=n-1,
第二行是n个整数,所有数据之间均用空格分隔。
Output
对于每组测试数据,输出单独的一行,对这n个整数进行m趟冒泡排序后的结果。
数据之间用一个空格分隔。
Sample Input
10 1
9 8 7 6 5 4 3 2 1 0
10 2
9 8 7 6 5 4 3 2 1 0
Sample Output
8 7 6 5 4 3 2 1 0 9
7 6 5 4 3 2 1 0 8 9*/
#define N 10
#define M 2
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int n;
int m;
int a[N];
struct LNode *next;
}*LinkList,LNode;
int main()
{
LinkList head,p1,p2;
int i,j,k,t;
for(i = 0;i < M;i++)
{
p1 = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->n);
if(p1->n >= 2 && p1->n <= 20)
{
scanf("%d",&p1->m);
}
else
{
printf("输入错误!");
}
if(p1->m >= 0 && p1->m <= (p1->n - 1))
{
for(j = 0;j < p1->n;j++)
{
scanf("%d",&p1->a[j]);
}
}
else
{
printf("输入错误!");
}
//冒泡排序
for(j = 0;j < p1->m;j++)
{
for(k = 0;k < p1->n - 1 - j;k++)
{
if(p1->a[k] > p1->a[k + 1])
{
t = p1->a[k];
p1->a[k] = p1->a[k + 1];
p1->a[k + 1] = t;
}
}
}
if(i == 0) head = p1;
else p2->next = p1;
p2 = p1;
}
p2->next = NULL;
while(head)
{
for(i = 0;i < head->n;i++)
{
printf("%d ",head->a[i]);
}
printf("\n");
head = head->next;
}
}
3.选择排序
/*Description
有n个整数,请使用选择排序算法对其按从小到大排序,输出第m趟排序的结果。
Input
测试数据有多组,每组的第一行是两个正整数n和m,其中2<=n<=20,0<m<=n-1,
第二行是n个整数,所有数据之间均用空格分隔。
Output
对于每组测试数据,输出单独的一行,对这n个整数进行m趟选择排序后的结果。
数据之间用一个空格分隔。
Sample Input
10 1
9 8 7 6 5 4 3 2 1 0
10 2
9 8 7 6 5 4 3 2 1 0
Sample Output
0 8 7 6 5 4 3 2 1 9
0 1 7 6 5 4 3 2 8 9*/
#define N 10
#define M 2
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int n;
int m;
int a[N];
struct LNode *next;
}*LinkList,LNode;
int main()
{
LinkList head,p1,p2;
int i,j,k,min,t;
for(i = 0;i < M;i++)
{
p1 = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->n);
if(p1->n >= 2 && p1->n <= 20)
{
scanf("%d",&p1->m);
}
else
{
printf("输入错误!");
}
if(p1->m >= 0 && p1->m <= (p1->n - 1))
{
for(j = 0;j < p1->n;j++)
{
scanf("%d",&p1->a[j]);
}
}
else
{
printf("输入错误!");
}
//选择排序
for(j = 0;j < p1->m;j++)
{
min = j;
for(k = 1;k < p1->n;k++)
{
if(p1->a[k] < p1->a[min])
{
min = k;
}
}
t = p1->a[min];
p1->a[min] = p1->a[j];
p1->a[j] = t;
}
if(i == 0) head = p1;
else p2->next = p1;
p2 = p1;
}
p2->next = NULL;
while(head)
{
for(i = 0;i < head->n;i++)
{
printf("%d ",head->a[i]);
}
printf("\n");
head = head->next;
}
}