冒泡排序、选择排序、计数排序(C语言实现)

本文介绍了冒泡排序、选择排序和计数排序三种基础的排序算法,通过实例演示和原理解析,帮助读者掌握这些在数据结构课程中的经典排序方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🔆欢迎来到我的【数据结构】专栏🔆

  • 👋我是Brant_zero,一名学习C/C++的在读大学生。
  • 🌏️我的博客主页​​​​​​➡➡Brant_zero的主页
  • 🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏

🍁前言

        堆排序、希尔排序、快速排序、归并排序这几个BOSS过后,我们将剩下三个比较简单的排序再实现一下,总算把八大排序都学习完了~~~

目录

一、 冒泡排序

二、 选择排序

三、计数排序


一、 冒泡排序

冒泡排序算法的原理如下: 

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素会是最大的数。 

  3. 针对所有的元素重复以上的步骤,除了最后一个。 

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 

我们来看看下面的动图:

void swap(int *a,int *b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void BubbleSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int exchange = 1;
		for (int j = 0; j < n - 1 - i; j++)
		{
			if ( a[j + 1]< a[j])
			{
				swap(&a[j], &a[j + 1]);
				exchange = 0;
			}
		}
		if (exchange)
			break;
	}
}

二、 选择排序

选择排序算法原理如下:

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  3. 重复第二步,直到所有元素均排序完毕

void swap(int *a,int *b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void SelectSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int temp = i;
		for (int j = i+1; j < n; j++)
		{
			if (a[j] < a[temp])
			{
				temp = j;
			}
		}
		swap(&a[temp], &a[i]);
	}
}

三、计数排序

计数排序算法原理如下:

  1. 计算出当前数据集合的范围区间range,即最大值 - 最小值。
  2. 开辟range大小的计数表(使用calloc),记录每个数据出现的次数。
  3. 统计每个数出现的次数,放到减去最小值后其在计数表中的相对位置
  4. 回写数据。遍历计数表,如果表中位置不为零,则直接回写到元素组中,其值为下标 + 最小值,则可将相对位置转回为绝对位置。

void CountSort(int* a, int n)
{
	int max = a[0];
	int min = a[0];
	for (int i = 1; i < n; i++)
	{
		if (max < a[i])
			max = a[i];
		if (min > a[i])
			min = a[i];
	}
	int range = max - min+1;
	int* temp = (int*)calloc(range, sizeof(int));
	for (int i = 0; i < n; i++)
	{
		temp[a[i] - min]++;
	}
	//回写
	int j = 0;
	for (int i=0;i<range;i++)
	{
		while (temp[i]--)
		{
			a[j++] = i+min;
		}
	}
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值