排序算法的实现(2)—选择排序(C语言)

昨天跟大家分享了冒泡排序的实现,排序算法有很多。今天我们就来看看另一个排序算法—选择排序。

话不多说,先给大家看看定义:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的中数据元素选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

给一张动图,让大家形象地看看。

查看源图像

 接下来是代码的实现

#include<stdio.h>
int main()
{
	int arr[] = { 2, 5, 3, 9, 6, 4 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("交换前:");
	for (; i<sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	for (i = 0; i<sz-1; i++)//要走的趟数
	{
		int tmp;
		int j = i;//从已经选完的下一个元素开始再排序
		int min = i;//记录最小值
		for (; j<sz; j++)//每一次要比的元素
		{
			if (arr[min]>arr[j])
			{
				min = j;
			}
		}
		//将两个变量交换,使得数组元素中最小的那个到第一个位置
		tmp = arr[i];
		arr[i] = arr[min];
		arr[min] = tmp;
	}
	printf("交换后:");
	for (i = 0; i<sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

选择排序将元素中最小的那个数一个一个挑出来,放到第一个,第二个....中,直到最后一次最后一个数已经是最大的数的时候就不需要再进行排序了。这样,整个数组就排序完成了。

这里依然有昨天的问题,我排到后面,突然发现已经是有序的了,怎么停掉,让这个代码效率更高一点呢?

优化:

#include<stdio.h>
int main()
{
	int arr[] = { 2, 5, 3, 9, 6, 4 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("交换前:");
	for (; i<sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	int flag = 1;
	int count = 0;//依然使用flag来记录一下是否进入if,用count来记录是否因偶次数而使flag又变回1
	for (i = 0; i<sz - 1; i++)
	{
		int tmp;
		int j = i;
		int min = i;//记录最小值
		for (; j<sz; j++)
		{
			if (arr[min]>arr[j])
			{
				min = j;
				flag = -flag;
				count++;
			}
		}
		if (flag == 1 && count % 2 != 0)
			break;
		//将两个变量交换,使得数组元素中最小的那个到第一个位置
		tmp = arr[i];
		arr[i] = arr[min];
		arr[min] = tmp;
	}
	printf("交换后:");
	for (i = 0; i<sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

来确定后面的元素还需不需要排序,不需要的话,立刻跳出来,从而减少程序运行的时间,加快程序的效率。

当然,选择排序也有它不好的地方,它是一种比较不稳定的算法,即,交换后,原来数组的一个元素顺序会被打乱,如有2个5,一个在前一个在后,而有一个较小的数字在第二个5之后,那么,交换过程中,有可能将前面的5换到后面去,两个的相对顺序自然就改变了。

好了,以上就是选择排序算法的实现和优化了。码字不易,看到这里不妨点个赞,点个关注,我会坚持更新,我是C_Ryson,从小白开始努力。一起加油吧。我们下次再见。

如有错误,请联系修改。

参考资料:

1,选择排序_百度百科 (baidu.com)

2,选择排序动图 - 国内版 Bing images

posted @   C_Ryson  阅读(87)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示