一、选择排序
1、选择排序相对于冒泡排序,要高效一些。因为冒泡排序会有大量的交换,而选择排序则可以直接将对应的元素放在指定的位置上。
2、选择排序由于每次都要遍历整个数组,需要遍历n次,所以选择排序的时间复杂度为
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;
}
}
}