首页 > 编程语言 >必学的简单排序算法——选择排序(c++)

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

时间:2024-10-18 17:21:53浏览次数:3  
标签:必学 min int 题解 nums 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
    }
};

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

在这里插入图片描述

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

标签:必学,min,int,题解,nums,c++,算法,排序
From: https://blog.csdn.net/ycs66/article/details/142966179

相关文章

  • 83. 删除排序链表中的重复元素 线性法&快慢双指针
    83.删除排序链表中的重复元素给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0,300] 内-100<=......
  • C++ -string -常见用法2
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......
  • C++ 基础-面试题01(C和C++区别、C结构体和C++结构体区别、C和C++ static区别、a和&a区
    1.C和C++的区别特性CC++编程范式面向过程编程面向对象编程+面向过程编程+泛型编程类和对象不支持类和对象支持类和对象,封装、继承、多态等特性标准库标准库有限,如stdio.h、stdlib.h丰富的标准库,如STL(容器、算法)函数和运算符重载不支持支持内存管理手动管理,使用malloc......
  • C++ 基础-面试题02(final和override关键字、sizeof和strlen区别、strcpy、sprintf 与me
    1.final和override关键字在C++中,final和override关键字是在面向对象编程中用于处理类的继承和多态的。它们主要用于管理派生类和虚函数,提供额外的安全性和代码可读性,防止意外的函数重写或错误的重载行为。1.final关键字final关键字用于防止进一步的继承或函数重......
  • 零基础学习C++(4.注释)
    注释#include<iostream>intmain(){ //这是单行注释 /* 这 是 多 行 注释 */ std::cout<<"helloworld"<<std::endl; return0;}注释掉的内容不会被执行。单行注释:使用//开始,直到行尾的所有内容都会被视为注释。多行注释:使用/开始,以/结束。这种......
  • C++入门Day0:规划开启
    首先介绍一下自己本人初二生一枚,曾经有过编程基础(Python),也曾几次学习C++,但总是半途而废(悲),想要参加算法竞赛,所以开启计划,在180天看完 C++PrimerPlus,故制定了此计划。因为学业紧张(山东),每天实际能拿出来的时间仅有一小时,所以放慢进度,争取吃透本书。每日学习计划(24周)第......
  • (C/C++)文件
     目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件3.文件的打开和关闭3.1文件指针3.2文件的打开和关闭4.文件的顺序读写fputcfgetcfputsfgetsfprintffscanffwritefreadsprintf和sscanf snprintf​编辑4对比一组函数(printf,sacnf系列)......
  • 最新毕设-SpringBoot-校园学习交流和资源共享平台-78210(免费领项目)可做计算机毕业设计
    目录1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1 数据流程2.2.2 用户登录流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析2.5本章小结3 系统......
  • C++顺序结构(3)、数据类型_____教学
    一、设置域宽setw()输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽。使用setw()前,必须包含头文件iomanip,即#include<iomanip>头文件iomanip,用来声明一些“流操作符”,需要一定格式输入输出时,就需要用到它,比较常用的有设置域宽、设置左右对齐、设置实数的精确度等。set......
  • 04C++顺序结构(3)
    一、设置域宽setw()输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽。使用setw()前,必须包含头文件iomanip,即#include<iomanip>头文件iomanip,用来声明一些“流操作符”,需要一定格式输入输出时,就需要用到它,比较常用的有设置域宽、设置左右对齐、设置实数的精确度等。set......