【排序算法】简单选择排序及实例_C语言代码实现_Python代码实现

博客对您有所帮助的话,欢迎给个赞啦,你的鼓励是对我最大的支持! 有不足之处也请您评论指教


简单选择排序

简单选择排序是选择排序的一种。

问:那么什么是选择排序?

答:每趟从待排序的记录中选出关键字最小的元素,顺序放在已排序的记录序列末尾,直到全部排序结束为止。

1 简单选择排序的思想与流程

从上文“什么是选择排序”,引申出简单选择排序的思想;

①从待排序数组元素中,找到值最小的元素;

②将值最小的元素与待排序数组元素的第一个元素互换;

③重复(元素个数-1轮次)①②,至此直到数组元素排序完成。

2 实例介绍

下面将某个实例和图片来介绍简单选择排序的思想和代码;

假设数组为:

a r r = [ 5 , 2 , 4 , 6 , 1 , 3 ] arr=[5, 2, 4, 6, 1, 3] arr=[5,2,4,6,1,3]

:下方介绍的图片显示颜色为就是已经排好的元素,显示为红色就是标记目前值最小的元素,显示为绿色就是正在遍历数组剩下的元素

1.第一轮(如动图1所示)

把未排序数组的第一个元素设为最小值(在本例中,设数组元素 5 为最小值,min=5),然后依次遍历剩下的元素。

①遍历第一个元素为2,2<5,故2设为最小值,min=2;
②遍历第二个元素为4,4>2,继续往后遍历;
③遍历第三个元素为6,6>2,继续往后遍历;
④遍历第四个元素为1,1<2,故1设为最小值,min=1;
⑤遍历第五个元素为3,3>1,继续往后遍历,后面没有元素,故将值最小的元素与待排序数组元素的第一个元素互换,1与5互换,元素1排序完毕,此时数组元素依次为1 2 4 6 5 3.

此时待排序数组依次为 2 4 6 5 3

请添加图片描述
图 1  简单选择排序第一轮 图1~简单选择排序第一轮 1 简单选择排序第一轮

2.第二轮(如动图2所示)

把未排序数组的第一个元素设为最小值(此时,min=2),然后依次遍历剩下的元素。

①遍历第一个元素为4,4>2,继续往后遍历;
②遍历第二个元素为6,6>2,继续往后遍历;
③遍历第三个元素为5,5>2,继续往后遍历;
④遍历第四个元素为3,3>2,继续往后遍历,后面没有元素,故将值最小的元素与待排序数组元素的第一个元素互换,第一个元素是其本身,故不动,元素2排序完毕,此时数组元素依次为1 2 4 6 5 3.

此时待排序数组依次为 4 6 5 3
请添加图片描述
图 2  简单选择排序第二轮 图2~简单选择排序第二轮 2 简单选择排序第二轮

3.第三轮(如动图3所示)

把未排序数组的第一个元素设为最小值(此时,min=4),然后依次遍历剩下的元素。

①遍历第一个元素为6,6>4,继续往后遍历;
②遍历第二个元素为5,5>4,继续往后遍历;
③遍历第三个元素为3,3<4,故3设为最小值,min=3,继续往后遍历,后面没有元素,故将值最小的元素与待排序数组元素的第一个元素互换,3与4互换,元素3排序完毕,此时数组元素依次为1 2 3 6 5 4.

此时待排序数组依次为 6 5 4

请添加图片描述
图 3  简单选择排序第三轮 图3~简单选择排序第三轮 3 简单选择排序第三轮

4.第四轮(如动图4所示)

把未排序数组的第一个元素设为最小值(此时,min=6),然后依次遍历剩下的元素。

①遍历第一个元素为5,6>5,故5设为最小值,min=5;
②遍历第二个元素为4,5>4,故4设为最小值,min=4,继续往后遍历,后面没有元素,故将值最小的元素与待排序数组元素的第一个元素互换,4与6互换,元素4排序完毕,此时数组元素依次为1 2 3 4 5 6.

此时待排序数组依次为 5 6

请添加图片描述
图 4  简单选择排序第四轮 图4~简单选择排序第四轮 4 简单选择排序第四轮

5.第5轮(如动图5所示)

把未排序数组的第一个元素设为最小值(此时,min=5),然后依次遍历剩下的元素。

①遍历第一个元素为6,5<6,继续往后遍历,后面没有元素,故将值最小的元素与待排序数组元素的第一个元素互换,第一个元素是其本身,故不动,元素5排序完毕,此时数组元素依次为1 2 3 4 5 6.

此时待排序数组依次为 6

请添加图片描述
图 5  简单选择排序第五轮 图5~简单选择排序第五轮 5 简单选择排序第五轮

最后一个元素不需要排序

此时经过5轮排序,排序完毕。

3 算法分析

3.1 时间复杂度

对于简单选择排序来说,无论初始数组元素是什么状态,其排序趟数永远是(元素个数-1)躺,元素间的比较始终为 O ( n 2 ) O(n^{2}) O(n2),而元素间的移动次数与初始状态有关,但上限为 O ( n ) O(n) O(n);
所以简单选择排序最好、最坏、平均时间复杂度均为 O ( n 2 ) O(n^{2}) O(n2)

3.2 空间复杂度

常数个辅助空间: O ( 1 ) O(1) O(1)

3.3 稳定性

不稳定

4 代码实现

4.1 C语言代码

#include<stdio.h>
int main()
{
	void select_sort(int arr[], int len);
	int arr[6] = { 5,2,4,6,1,3 };
	int len=sizeof(arr)/sizeof(int);
	int i;
	printf("排序之前的数组元素依次为:");
	for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n"); 
	select_sort(arr,len);
	printf("排序之后的数组元素依次为:");
	for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n"); 
	return 0; 
} 
void select_sort(int arr[], int len)
{
	int i,j;
	int min;
	int temp;
	int k;
	for(i=0;i<len-1;i++)
	{
		min = i;
		for(j=i+1;j<len;j++)
		{
			if(arr[j]<arr[min]) min = j;
		}
		if(min!=i) 
		{
			temp = arr[i];
			arr[i] = arr[min];
			arr[min] = temp;
		}
		// 输入排序每轮结果
		printf("第%d轮",i+1);
		for(k=0;k<len;k++)
		{
			printf("%d ",arr[k]);
		}
		printf("\n");
	}
}

运行结果:
在这里插入图片描述
图 6   C 语言代码运行结果 图6~C语言代码运行结果 6 C语言代码运行结果

4.2 Python语言代码

def simpleselect_sort(List, len):
    ''' Function description: selection sort
    Parameters:  List:待排序数组 len:待排序数组长度 return:升序数组
    Author: kt4ngw
    Address: https://blog.csdn.net/t4ngw '''
    for i in range(len-1):
        min = i
        for j in range(i+1, len):
            if(List[j] < List[min]):
                min = j
        if(min != i):
            List[i], List[min] = List[min], List[i]
    return List
List = [5, 2, 4, 6, 1, 3]
print("简单选择排序前的数组:")
print(List)
print("简单选择排序后的数组:")
print(simpleselect_sort(List, len(List)))

# 不稳定

运行结果:
在这里插入图片描述
图 7   P y t h o n 语言代码运行结果 图7~Python语言代码运行结果 7 Python语言代码运行结果

1.5 参考文献

[1]王道论坛. 2022年数据结构考研复习指导[M]. 北京:电子工业出版社, 2021.


写在最后面的话,此博客为个人通过书本和互联网作为学习资源自己整理而成的笔记,仅作为知识记录及后期复习所用,如有错误,还望评论指教 ——kt4ngw.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值