常用的排序算法(03)—— 选择排序

一、选择排序

1、选择排序相对于冒泡排序,要高效一些。因为冒泡排序会有大量的交换,而选择排序则可以直接将对应的元素放在指定的位置上。

2、选择排序由于每次都要遍历整个数组,需要遍历n次,所以选择排序的时间复杂度为 {\color{Red}O^{2}}

3、基本思想是:每次选择一个元素作为最小值,然后遍历选定元素之后的所有元素。如果后面有元素大于选定的元素,就将其进行交换,这样经过一轮循环之后,最小的元素就位于数组的首地址处。依次将后序的元素作为选定的元素来进行同样的处理,直至整个数组排序完成。

二、选择排序的两种不同处理方式

1、每次比较之后都将对应的元素进行交换:

/*
方法一:首先选择第一个元素,默认为最小值,再用其后面的每个元素依次与其进行比较,
若后面的元素小于它,就将它们进行交换。这样一轮下来,最小的元素就在首位。
再依次选择第二个元素作为最小元素,用同样的方式来进行排序,直至所有的元素排序完成
*/
void SortBySelect01(int* array, int len)
{
	for (int i = 0; i < len-1; ++i)
	{
		
		for (int j = i + 1; j < len; ++j)
		{
			if (array[i] > array[j])
			{
				int temp = array[i];
				array[i] = array[j];
				array[j] = temp;
			}
		}
	}
}

2、每次比较之后将最小元素的下标保存起来,再根据下标是否相同来决定是否需要交换:

/*
方法二:选择排序的改进版,每次循环将最小元素的下标赋给minIndex,而不是直接交换这两个元素,
这样就减少了交换的次数,提高程序的效率。经过一次循环之后就会得到最小元素的下标,在这次循环
之后,将这次选定的元素下标与循环得到的最小元素下标进行对比,如果下标相同说明选定的元素就是最小值,
否则选定的元素不是最小值,循环得到的元素才是最小值,然后将其进行交换。
这样经过多次循环之后,就可以得到最终排序好的数组。
*/
void SortBySelect02(int *array, int len)
{
	for (int i = 0; i < len - 1; ++i)
	{
		int minIndex = i;
		for (int j = i + 1; j < len; ++j)
		{
			if (array[minIndex] > array[j])
				minIndex = j;
		}
		if (minIndex != i)
		{
			int temp = array[i];
			array[i] = array[minIndex];
			array[minIndex] = temp;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值