直接选择排序

思想

  首先要明确的是,已排序序列在前,待排序序列在后,第一轮的待排序序列就是整个序列,每一轮在待排序序列中选出本轮最小的元素放在待排序序列,然后将这个首位纳入已排序序列,待排序序列元素数目相应减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交换。所以是不稳定的

原文地址:https://www.cnblogs.com/Joezzz/p/9647547.html