各种排序算法

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;
	} 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值