思想
首先要明确的是,已排序序列在前,待排序序列在后,第一轮的待排序序列就是整个序列,每一轮在待排序序列中选出本轮最小的元素放在待排序序列的首位,然后将这个首位纳入已排序序列,待排序序列元素数目相应减1;不断重复上述操作,直到已排序序列长度为数组长度
代码实现
void sortSelect(vector<int>& nums) { int n = nums.size(); for (int i = 0; i <= n - 2; ++i) { int miniIndex = i; for (int j = i + 1; j <= n-1; ++j)//选出本轮最小元素的下标 { if (nums[j] < nums[miniIndex]) miniIndex = j; } if (miniIndex != i)//如果最小元素不在首位,则把它换到首位;如果在首位,则不需要换 swap(nums[i], nums[miniIndex]); } }
时间复杂度
最好情况O(n2),最坏情况O(n2),平均情况O(n2)
空间复杂度
O(1)
稳定性
选到了最小元素可能会有跳跃性的交换,即:把最小的元素换到首位也就有可能把一个相同元素换到后面去,如:序列5 8 5 2 9,我们知道第一轮第1个元素5会和2交换。所以是不稳定的