1、选择排序介绍
选择排序(Selection sort)是一种简单直观的排序算法。
2、选择排序演示
动画演示链接:Selection Sort Animation by Y. Daniel Liang
3、选择排序原理
第一次从待排序(演示图紫色数据)的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序(演示图绿色数据)的序列的末尾。
以此类推,直到全部待排序的数据元素的个数为零。
4、选择排序性能
1、稳定性
算法稳定性是指如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。
选择排序是不稳定的。在一趟选择中,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比如序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。2、时间复杂度
算法的时间复杂度会随着排序集合的有序性而改变。
最好时间复杂度:在完全有序或有序度为满的情况下的时间复杂度
最坏时间复杂度:在完全逆序或有序度为 0 的情况下的时间复杂度
----------------------------------------------------------------------------------------
选择排序最好情况:时间复杂度是
选择排序最坏情况:时间复杂度是
选择排序最好最坏情况时间复杂度相同,说明其与初始序列无关。3、空间复杂度
算法的空间复杂度就是内存消耗。
选择排序的空间复杂度为,需要一个临时变量来交换元素位置,因而其空间复杂度为
。
4、原地排序
原地排序(Sorted in place)是指空间复杂度为的排序算法。
5、选择排序C++代码实现
int* SelectionSort(int arr[], int len) {
int indexOfSmallestElement, temp;
for (int i = 0; i < len; i++) {
indexOfSmallestElement = i;
for (int j = i + 1; j < len; j++) {
if (arr[j] < arr[indexOfSmallestElement])
indexOfSmallestElement = j;
}
// 交换
if (indexOfSmallestElement != i) {
temp = arr[i];
arr[i] = arr[indexOfSmallestElement];
arr[indexOfSmallestElement] = temp;
}
}
return arr;
}