数据结构与算法 - 选择排序

选择排序

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕。

image

我们以 [ 8,2,5,9,7 ] 这组数字做例子。

image

## 第一次选择 第一次选择,先找到数组中最小的数字 2 ,然后和第一个数字交换位置。(如果第一个数字就是最小值,那么自己和自己交换位置,也可以不做处理,就是一个 if 的事情)

image

第二次选择

第二次选择,由于数组第一个位置已经是有序的,所以只需要查找剩余位置,找到其中最小的数字5,然后和数组第二个位置的元素交换。

image

第三次选择

第三次选择,找到最小值 7 ,和第三个位置的元素交换位置。

image

第四次选择

第四次选择,找到最小值8,和第四个位置的元素交换位置。

image

最后一个到达了数组末尾,没有可对比的元素,结束选择。

如此整个数组就排序完成了。

代码实现

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)\);

posted @ 2021-12-24 15:58  Logan_Xu  阅读(25)  评论(0编辑  收藏  举报