选择排序
算法思想
选择排序是一种比较直观的排序算法,选择排序的工作原理是每次从待排序的数据中选择最小的数字放在当前位置,然后向前前进一个位置,把剩余数据的最小的数字放在现在的位置,依次类推,直到待排序的数据的数量为零。(升序的排列思想)
算法步骤:
- 设置当前位置的下标为最小的数字
- 在待排序的数据中,选择最小的下标(与当前设置最小数字作比较)
- 交换当前位置元素和最小下标的元素
- 数据位置向前进一步,继续1~3步骤,直到排序结束
选择排序是一种不稳定的排序算法,这里举个例子可以更好的说明为什么是不稳定的排序算法,例如给定一个待排序的序列 arr=[3,3,1],经过第一轮的筛选后第0个位置的数字3,要和第2个位置的1做一次交换,arrChange=[1,3,3],现在这个序列是排好序的序列,但是,第一个3是arr序列下标为1,第二个3是arr序列下标为0,意思是下标为0的3跑到了下标为1的3的前面,所以是一个不稳定的排序算法。
选择排序不需要额外的空间复杂度,只需要一个简单的临时遍历用于数据交换,所以空间复杂度为 O ( n ) O(n) O(n),但是需要用一个外层循环用于选择一个待排序的数字,内层循环用于找到待排序数字中的最小的数字,所以选择排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
代码实现
#include <iostream>
#include <vector>
using namespace std;
void selectionSort(vector<int>& vec) {
// 如果给定的序列长度小于2,那么表示该序列不需要排序,直接返回
if (vec.size() < 2) {
return;
}
// 外层循环表示需要排序的数字,内层进行选择当前的数字是否是相对该位置向后的最小的数字
for (int i = 0; i < vec.size(); i++) {
int minIndex = i;
for (int j = i+1; j < vec.size(); j++) {
if (vec[j] < vec[minIndex]) {
minIndex = j;
}
}
// 找到最小的数字的下标,与当前位置数字进行交换,外层每循环一次就会排列好一个数字
int temp = vec[minIndex];
vec[minIndex] = vec[i];
vec[i] = temp;
}
}
/*
* 代码测试
*/
int main() {
vector<int> arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
selectionSort(arr);
for (int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
总结
- 稳定性:不稳定
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( 1 ) O(1) O(1)
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步