选择排序也是一种很直观的排序方法,它从无序区里 选择 一个元素,与无序区中的第一个元素交换位置。算法
在咱们的平常生活中,其实也常用选择排序,下面以摆放俄罗斯套娃为例。bash
在摆放时,咱们将套娃划分为两个区:有序区和无序区。有序区的套娃已是按顺序排列的,而每次要摆放新的套娃时,咱们在无序区中选择一个最小的套娃,与无序区的第一个套娃交换位置。spa
进行到无序区只有最后两个元素时,排完这一趟即宣告结束。3d
使用天然语言能够描述以下:code
从第一个套娃开始,直到倒数第二个套娃:
找到最小的套娃;
与此轮遍历开始的套娃交换位置;
复制代码
能够用一张简单的图表示选择排序:cdn
使用 C 语言实现以下:blog
void SELECTSORT(int dolls[], int totalOfDolls) {
for (int i = 0; i < totalOfDolls - 1; i++) {
int minDosPos = i;
for (int j = i; j < totalOfDolls; j++) {
if (dolls[j] < dolls[minDosPos]) {
minDosPos = j;
}
}
if (minDosPos != i) {
int temp = dolls[i];
dolls[i] = dolls[minDosPos];
dolls[minDosPos] = temp;
}
}
}
复制代码
对于 n 个元素的序列,选择排序一共须要 n - 1 趟排序。排序
只须要一个辅助空间,即 minDosPos,空间复杂度为 O(1)。it
能够发现,不管套娃的初始状况如何,选择排序法每一趟始终要进行 n - i 次元素的比较,因此元素的比较总次数为 。io
这说明 选择排序法所进行的元素之间的比较次数与原始状态无关。
由上可知,时间复杂度为 O()。
选择排序中,相同大小的元素在被选择时,处在前面的元素极可能在选择时被置换到后面去,仔细观察上文套娃的例子,一样大小的套娃在摆放后相对顺序发生了改变,因此选择排序是 不稳定排序算法。