c语言 排序算法

排序算法是在很多语言中都是一个不可或缺的算法,十分基础有十分经典,而排序算法有分为很多种,我目前掌握的有以下几种:冒泡法,选择法,插入法,和希尔法。这几种算法理解程度是从易到难的,但是这几个算法中最好用的也是计算次数应该是这几个当中最小的,效率最高的,但是他也很考验你对他的理解,需要考验你的分组什么的,也是十分棘手的,但这也是我最喜欢的排序算法,由于还没有完全掌握,所以这篇篇文章暂时不对这个展开讨论。这篇文章我们主要围绕冒泡和选择两种我掌握的好一点的算法开始。

  1. 冒泡排序
    首先是最容易理解的冒泡排序法,也是我最开始接触到的排血算法。它的核心内容是把每一个数与它后面的数比较,如果比他大,则交换位置,一直循环完所要比较的数,最后输出排序内容就是想要的结果。
    下面是代码:
#include<stdio.h>
int main()
{
	int i, a[10], j, tem;//这里主要是设置十个数的排序做个例子
	for (i = 0; i < 10; i++)//输入所要排序的十个数
		scanf_s("%d", &a[i]);
	for (j = 0; j < 9; j++)//这里只进行九次循环的原因是每一个数都要和后面的数比较,
	{//要想得到真正的排好序的数列,要排序n-1次,
		for (i = 0; i < 9 - j; i++)//这里的第二层循环是每一个数都要和后面的数作比较,当第一次循环完后
			//最大的数就被派到了最后,一次循环排好一个数,以此类推,九次排号就个数,最后一个自然归位了。
		{	
			if (a[i] > a[i + 1])
			{
				tem = a[i];
				a[i] = a[i + 1];
				a[i + 1] = tem;//这里依靠中间量tem对两个数进行转变
			}
		}
	}
	for (i = 0; i < 10; i++)//输出十个数
		printf("%d ", a[i]);
	return 0;
}

这是改良版的,可以设置排序任意个数,改变N的大小即可。

#include<stdio.h>
#define N 10
int main()
{
	int i, a[N], j, tem;//这里主要是设置十个数的排序做个例子
	for (i = 0; i < N; i++)//输入所要排序的十个数
		scanf_s("%d", &a[i]);
	for (j = 0; j < N-1; j++)//这里只进行九次循环的原因是每一个数都要和后面的数比较,
	{//要想得到真正的排好序的数列,要排序n-1次,
		for (i = 0; i < N-1 - j; i++)//这里的第二层循环是每一个数都要和后面的数作比较,当第一次循环完后
			//最大的数就被派到了最后,一次循环排好一个数,以此类推,九次排号就个数,最后一个自然归位了。
		{	
			if (a[i] > a[i + 1])
			{
				tem = a[i];
				a[i] = a[i + 1];
				a[i + 1] = tem;//这里依靠中间量tem对两个数进行转变
			}
		}
	}
	for (i = 0; i < N; i++)//输出十个数
		printf("%d ", a[i]);
	return 0;
}

冒泡排序是最容易理解的排序算法,但是他的缺点也很明显,那就是算法次数巨大,不利于较大的数据处理。

  1. 选择排序
    选择排序同样也是一个比较容易理解的排序算法。他的原理是将数据中的所有数据都与本次循环的第一个数比较,如果比第一个数小则交换。直至循环完所有数。
    下面是他的源代码:
#include<stdio.h>
#define N 10
int main()
{
 
		int i, a[N], j, tem;//这里主要是设置十个数的排序做个例子
		for (i = 0; i < N; i++)//输入所要排序的十个数
			scanf_s("%d", &a[i]);
		int min=0;
		for (i = 0; i < N - 1; i++)
		{
			int min = i;//将每一次循环的开始值都设为min
			for (j = i + 1; j < N; j++)//每一次比较都要从该数后面的一个数开始到最后一个数结束
				//每一次外循环后都会减少一个内循环
				if (a[i] > a[j])min = j;
				{
					tem = a[i];
					a[i] = a[min];
					a[min] = tem;
				}
		}
		for (i = 0; i < N; i++)//输入所要排序的十个数
			printf("%d", a[i]);
	return 0;
}

选择排序其实与冒泡排序的方法差不多,区别差异不大。最特别的是希尔排序,我要抓紧时间搞懂。加油!

这是第一天码字,很生疏,居然就两篇文章从12点打到两点了,有点累但是心中充满希望,加油吧,少年!
作于2021年11月15日凌晨2:09
中南林桃园

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值