各种排序算法

1.直接插入排序

/*Description
有n个整数,请使用插入排序算法对其排序,并输出经过m趟排序后的序列(按从小到大排序)。
Input
测试数据有多组,每组的第一行是两个正整数n和m,其中2<=n<=20,0

#define M 2
#define N 10
#include 
#include 

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 

#define N 10
#define M 2
#include 
#include 

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

#define N 10
#define M 2
#include 
#include 

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;
	} 
}

你可能感兴趣的:(c语言,排序算法)