C语言之排序算法

排序算法是算法里面的基础,算法主要是考验思维,在这里会介绍三个简单的算法:直接插入排序,选择排序,冒泡排序。

直接插入排序
直接插入排序经过 n-1 次循环将需要排序的元素排序好,每一次循环依次添加一个后面的新元素到前面排好序的元素中,时间复杂度为(n^2)。代码如下

/*
直接插入排序
参数:需要排序的数组,数组中元素的个数
返回值:无
*/
void Zhi_Jie(int a[],int num)
{
	int n,m,z,k;
	for(n = 0;n < num;n++)
	{
		z = a[n];
		m = n-1;
		while((m >= 0) && (z < a[m]))
		{
//			a[m+1] = a[m--];//方法一,一步到位,让人看得更加清楚,下面是分解的写法
			k = a[m+1];
			a[m+1] = a[m];
			a[m] = k;
			m--;
		}
		a[m+1] = z;//找到了要插入的位置
	}
}

选择排序:
选择排序也是经过n-1次循环将需要排序的元素排序好,每一次循环是寻找后面元素中最小/最大的元素,插入到前面排好序的后面,时间复杂度为(n^2)。代码如下

/*
选择排序实现排序
参数:需要排序的数组,数组中元素的个数
返回值:无
*/
void Xuan_Ze(int a[],int num)
{
	int m,n,z,k;
	for(m = 0;m < num-1;m++)
	{
		z = m;
		for(n = m+1;n < num;n++)
			if(a[z] > a[n])
				z = n;
		if(m != z)//标志位发生了变换,说明大小发生的改变
		{
			k = a[z];
			a[z] = a[m];
			a[m] = k;		
		}
	}
}

冒泡排序
冒泡排序也是经过n-1次循环将需要排序的元素排序好,每一次循环找到最大/最小的元素,移动到后面排好序的元素前,时间复杂度为(n^2)。代码如下

/*
冒泡的方法实现排序
参数:需要排序的数组,数组中元素的个数
返回值:无
*/
void Mao_Pao(int a[],int num)
{
	int m,n,z;
	for(m = 0;m < num;m++)
		for(n = m+1;n < num;n++)
			if(a[m] > a[n])
			{
				z = a[m];
				a[m] = a[n];
				a[n] = z;
			}
}

接下来就是主函数的了,代码如下:

#include"stdio.h"

//宏定义数组中元素的个数
#define test_num 5    

//这里加上上面写的函数即可。

int main()
{
	int a[test_num];
	int i;
	printf("请输入%d个数字,每输入完一个就回车一次:\n",test_num);
	for(i = 0;i < test_num;i++)
	{
		scanf("%d",&a[i]);
	}
	printf("你输入的数字是 :");
	for(i = 0;i < test_num;i++)
	{
		printf("%d ",a[i]);
	}	
	printf("\n");

//排序操作
//	Mao_Pao(a,test_num);
//	Zhi_Jie(a,test_num);
//	Xuan_Ze(a,test_num);

	printf("排序之后的顺序为 :");
	for(i = 0;i < test_num;i++)
	{
		printf("%d ",a[i]);
	}	
	printf("\n");
	return 0;
}

排序算法重在思维上的理解,理解好了之后操作起来就不难了,这三个都是比较基础的排序算法,有问题或者有建议的小伙伴可以添加我的个人微信 lqy—1997 (中间是三个英文的杠)或者留言进行交流。

发布了31 篇原创文章 · 获赞 52 · 访问量 8875

猜你喜欢

转载自blog.csdn.net/yuanbaba_123/article/details/94431006
今日推荐