算法 | 图解选择排序

举报
mindtechnist 发表于 2023/05/11 14:24:39 2023/05/11
【摘要】 简单选择排序,Simple Selection Sort,用一句简述选择法排序即,每次选择一个最小的元素放在最前面。选择排序的基本思想是,在每一趟排序中,从n-i+1个元素中选择一个最小的元素与i位置上的元素交换,也就是说每次从无序子序列中选择一个最小的元素,并把该元素放在无序子序列的第一个位置上。这样,每趟选择排序需要比较n-i次,只需要交换1次。

目录

选择排序算法步骤分析

选择排序的稳定性分析

选择排序的代码实现

 选择排序的时间复杂度


选择排序算法步骤分析

简单选择排序,Simple Selection Sort,用一句简述选择法排序即,每次选择一个最小的元素放在最前面。选择排序的基本思想是,在每一趟排序中,从n-i+1个元素中选择一个最小的元素与i位置上的元素交换,也就是说每次从无序子序列中选择一个最小的元素,并把该元素放在无序子序列的第一个位置上。这样,每趟选择排序需要比较n-i次,只需要交换1次。

第一趟选择排序:

将第1个元素与后面n-1个元素都进行比较 ,选择出一个最小的元素,并把该元素与0位置的元素进行交换,总共需要n-1次比较,1次交换。


经过一趟选择排序后,整个数组的最小元素被放在了0号位置,无序数组的长度只剩下n-1个元素。

第二趟选择排序:

从第二个元素开始的子序列,即(1, 2, 3, 4)的元素,将该无序子序列的第一个元素与后面的每一个元素比较,选择出最小的元素,并和该无序子序列的第一个位置元素进行交换。第二趟选择排序总共进行了n-2次比较,未发生交换(最好的情况是不交换,最差的情况是交换一次)。

 经过第二趟选择排序,整个数组最小的两个元素已经按照顺序排在了最前面,有序子序列长度为2,无序子序列长度为n-2。

第n-1趟排序:

第n-1趟排序,要进行n-(n-1)次比较,最多进行一次交换。

选择排序的稳定性分析

假如说有一个序列{5, 6,7, 5, 2, 8 },第一趟选择排序的时候会把开头的5拿出来和2交换,这样原本在前面的5跑到了另一个5的后面,所以,简单选择排序是不稳定的。

 可以看到,原本红色的5在黑色的5前面,经过一趟排序后,红色的5跑去了黑色5的后面。所以,选择排序是不稳定的。

选择排序的代码实现

/*交换 i j 位置的元素*/
void swap(int array[], int i, int j)
{
	int temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}

/*选择排序*/
void select_sort(int array[], int num)
{
	int i = 0, j = 0, MinRecord = 0; /*MinRecord用于记录最小元素的位置*/
	for (i = 0; i < num - 1; i++)
	{
		MinRecord = i;
		for (j = i + 1; j < num; j++)
		{
			if (array[j] < array[MinRecord])
			{
				MinRecord = j; /*更新最小元素下标*/
			}
		}
		swap(array, i, MinRecord);
	}
}

 选择排序的时间复杂度

 选择排序总共需要n-1趟排序,第i趟选择排序要进行n-i次比较,至多1次交换。所以最坏的情况下,n-1趟排序总共需要(n-1)+(n-2)+\bullet \bullet \bullet +2+1次比较和n-1次交换(最坏每趟交换一次),时间复杂度为O(n^{2})

选择排序算法是一种,不稳定的,时间复杂度为O(n^{2})的,简单内排序算法。

(内排序:在内存中完成排序;外排序:排序过程需要内外存交互。)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。