数据结构与算法 - 选择排序
选择排序
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕。
我们以 [ 8,2,5,9,7 ]
这组数字做例子。
第二次选择
第二次选择,由于数组第一个位置已经是有序的,所以只需要查找剩余位置,找到其中最小的数字5,然后和数组第二个位置的元素交换。
第三次选择
第三次选择,找到最小值 7 ,和第三个位置的元素交换位置。
第四次选择
第四次选择,找到最小值8,和第四个位置的元素交换位置。
最后一个到达了数组末尾,没有可对比的元素,结束选择。
如此整个数组就排序完成了。
代码实现
vector<int> select_sort(vector<int> &nums)
{
int nSize = nums.size();
for(int i = 0; i < nSize; i++)
{
int minIdx = i;
for(int j = i; j < nSize; j++)
{
if(nums[j] < nums[minIdx])
{
minIdx = j;
}
}
// swap nums[i] and nums[minIdx]
nums[i] = nums[i] & nums[minIdx];
nums[minIdx] = nums[i] & nums[minIdx];
nums[i] = nums[i] & nums[minIdx];
}
return nums;
}
特点
稳定性:不稳定。
空间复杂度:在原序列进行操作,故为 \(O(1)\);
时间复杂度:需要 2 次循环遍历,故为 \(O(n^2)\);