必学的简单排序算法——选择排序(c++)

前言

排序算法虽然简单,但是我也要掌握熟练应用,因为学习算法这个复杂的过程,我们应该由浅到深,由简单到复杂,并且该算法在acm,蓝桥杯等算法竞赛中可能会用到。让我们来深入了解该算法。

在这里插入图片描述

一、什么是选择排序

选择排序是一种简单的排序算法,**它的基本思想是每次从未排序的部分中选择最小的元素,与未排序部分的第一个元素交换位置。**这样,每次选择后,已排序的部分就增加一个元素,未排序的部分就减少一个元素,直到整个数组都排序完成。选择排序的时间复杂度是O(n^2),空间复杂度是O(1)。

二、算法图解

在这里插入图片描述

三、经典例题

1、颜色分类

(帅哥们这个蓝色字体可以点进去看原题)

题解思路

从i=0定义一个元素最小值的下标为min,然后再从i+1遍历数组找到比min下标元素值小的元素,将min赋值为j,然后在和下标为i的元素的值进行交换。

代码题解

class Solution {
public:
    void sortColors(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            int min=i;
            for(int j=i+1;j<nums.size();j++){
                if(nums[j]<nums[min]){
                    min=j;
                }
            }
            int t=nums[i];
            nums[i]=nums[min];
            nums[min]=t;
        }
    }
};

2、至少是其他数字两倍的最大数

(帅哥们这个蓝色字体可以点进去看原题)

解题思路

将元素组最大值的下标找出来,赋值给max,然后用选择排序排序数组,再用排完序数组倒数第二个值(也就是第二大的值)与最大值比较。

代码题解

class Solution {
public:
    int dominantIndex(vector<int>& nums) {
        int max=0;
        for(int i=1;i<nums.size();i++){
            if(nums[i]>nums[max])max=i;//先找最大值的下标
        }
        for(int i=0;i<nums.size();i++){//排序数组
            int min=i;
            for(int j=i+1;j<nums.size();j++){
                if(nums[j]<nums[min])min=j;
            }
            int t=nums[min];
            nums[min]=nums[i];
            nums[i]=t;
        }
        int n=nums.size();
        if(nums[n-1]>=2*nums[n-2])return max;//如果最大值是第二大值的两倍返回最大下标
        return -1;
    }
};

3、寻找两个正序数组的中位数

(帅哥们这个蓝色字体可以点进去看原题)

解题思路

把num2的元素通通插入num1中,这时候在进行选择排序,如果元素个数为奇数就返回数组长度除以二的值,反之为偶数,就返回中间两个数的和除以2。

代码题解

class Solution {
    void selectionSort(vector<int>&a){
        for(int i=0;i<a.size();i++){
            int min=i;
            for(int j=i+1;j<a.size();j++){
                if(a[j]<a[min])min=j;
            }
            int t=a[i];
            a[i]=a[min];
            a[min]=t;
        }
    }
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        for(int i=0;i<nums2.size();i++){
            int x=nums2[i];
            nums1.push_back(x);
        }
        selectionSort(nums1);
        int n=nums1.size();
        if(n&1)return nums1[n/2];//如果是奇数个元素返回数组下标为n/2的值
        return (nums1[n/2-1]+nums1[n/2])*1.0/2;//反之为偶数就返回中间那两个数之和除以2
    }
};

#四 总结
相信学到这里那你已经对选择排序有更深的理解,如果还不明白,那就说明需要多练,菜就多练,关注我,以后持续更新更多算法作品,和我一起学习,听到了没。

在这里插入图片描述

希望各位帅哥可以点赞加关注支持一下,非常感谢!!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值