一起学算法(选择排序篇)

news2024/10/6 6:03:51

       距离上次更新已经很久了,以前都是非常认真的写笔记进行知识分享,但是带来的情况并不是很好,一度认为发博客是没有意义的,但是这几天想了很多,已经失去了当时写博客的初心了,但是我觉得应该做点有意义的事,将知识分享给那些乐于学习想钻研的同学,我们可以一起学习,一起进步,所以想出以个系列(算法篇),将我学习算法的过程记录下来,一起加油!!!废话不多说,看正片

1. 概念:

选择排序(Selection sort)是一种简单直观的排序算法,由于是选择,所以在交换的过程中元素的相对位置可能会发生变换,所以该算法是不稳定排序

选择排序中的关键在于,怎么找出一堆数据中最小(最大)的,和冒泡排序相比,选择排序比冒泡排序的效率高,高在交换位置的次数上,选择排序的交换位置是有意义的交换,每次遍历剩下的元素找到最小值(最大值),拿到这个最值与最前面的元素进行交换

 举个栗子:假如我们现在需要给一个数组进行排序[3,2,5,9,4];

第一次参与比较的数据:3  2  5  9  4(最前面的元素索引为0,所以找到最小的元素和索引为0的元素进行交换)

最小值:3 2 5 9 4-->2

所以交换完数组中变为2  3  5  9  4

第二次参与比较的数据3  5  9  4(最前面的索引为1)

最小值:3 5 9 4

所以交换为数组变为3  5  9  4(因为本身索引为1的元素就是数组中元素最小的,所以不需要进行交换位置)

依次类推...

最后排好序的数组是[2,3,4,5,9]

具体实现:使用双重循环,外层循环控制比较的次数,内循环找出每次比较数据中的最小值,然后将其放入已排序的末尾

 public void selection(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) { // 寻找的次数
            // 假设i的位置就是数组中未排序元素值中最小值的位置
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) { // 与后面的元素进行比较
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            // 若最小值不等于当前i,则进行交换
            if (minIndex != i) {
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
    }

2.leetcode题单

学会选择排序,我们可以顺便解决leetcode上的这些题:

颜色分类

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

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

判断能否形成等差数列

颜色分类:

class Solution {
    public void sortColors(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        //计数排序
        int max=Arrays.stream(nums).max().getAsInt();
        int[] hash=new int[max+1];
        for (int i = 0; i <nums.length; i++) {
            hash[nums[i]]++;
        }
        int index=0;
        for (int i = 0; i <hash.length; i++) {
              int n=hash[i];
              while(n!=0){
                  nums[index++]=i;
                  n--;
            }
        }
    }
}

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

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if (nums1 == null && nums2 == null) {
            return 0;
        }
        //将两个数组合并成一个数组然后取中间值
        int[] sortNum = new int[nums1.length + nums2.length];
        int q = sortNum.length;
        ;
        int i = 0;
        int j = 0;
        int k = 0;
        int m = nums1.length;
        ;
        int n = nums2.length;
        while (i < m && j < n) {
            if (nums1[i] < nums2[j]) {
                sortNum[k++] = nums1[i++];
            } else {
                sortNum[k++] = nums2[j++];
            }
        }
        while (i < m) {
            sortNum[k++] = nums1[i++];
        }
        while (j < n) {
            sortNum[k++] = nums2[j++];
        }
        //数组分为奇数和偶数
       if((q&1)==1){
           return sortNum[q/2];
       }else{
           return (sortNum[q/2]+sortNum[(q/2)-1])/2.0;
       }
    }
    }

至少是其他数字两倍大的数字

class Solution {
      public int dominantIndex(int[] nums) {
        if (nums == null) {
            return 0;
        }
        int max=nums[0];
        int maxIndex = 0;
        for (int i = 1; i < nums.length; i++) {
             if(nums[i]>max){
                 max=nums[i];
                 maxIndex=i;
             }
        }
        Arrays.sort(nums);
        if (nums[nums.length - 1] >= 2 * nums[nums.length - 2]) {
            return maxIndex;
        }else{
            return -1;
        }
    }
}

判断能否形成等差数列

class Solution {
    public boolean canMakeArithmeticProgression(int[] arr) {
        if(arr==null||arr.length==0){
            return false;
        }
        Arrays.sort(arr);
        int k=arr[1]-arr[0];
        for (int i =1; i <arr.length; i++) {
            if(arr[i]-arr[i-1]!=k){
                return false;
            }
        }
        return true;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学分析:流形的线性代数回顾

因为是线性的&#xff0c;所以可以把所有的系数都提取出去。这也是多重线性代数的性质。可以看成基本的各项自变量的乘法。 这里可以看到两个不同基向量下&#xff0c;他们的坐标转化关系。 引出了张量积&#xff0c;也就是前面提到的内容。 对偶空间的例子总是比较美好。 因为…

【暑期每日一练】 day9

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 …

小目标检测(1)——大恒(DaHeng)相机操作与控制编程

文章目录 引言正文相关开发库的介绍编程准备配置引用头文件GalaxyIncludes.h配置lib文件 具体编程过程初始化和反初始化枚举设备开关设备 属性控制属性控制器种类 图像采集控制和图像处理采单帧回调采集图像处理流对象属性控制 获取设备事件获取掉线事件通知 样例程序分析补充&…

6.3.tensorRT高级(1)-yolov5模型导出、编译到推理(无封装)

目录 前言1. YOLOv5导出2. YOLOv5推理3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-yolov5模…

复习之linux高级存储管理

一、lvm----逻辑卷管理 1.lvm定义 LVM是 Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制。 逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动&#xff0c;是在内核中块设备和物理设备…

内网隧道代理技术(十五)之 Earthworm的使用(二级代理)

Earthworm的使用(二级代理) 本文紧接着上一篇文章继续讲解Earthworm工具的使用 (二级代理)正向连接 二级正向代理发生在如下的情况: 1、Web服务器在公网,黑客可以直接访问 2、B机器在内网,黑客不能直接访问 3、Web服务器可以访问内网机器B 4、内网机器B可以访问公司…

jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比

一、数据结构差别 1.7&#xff1a;数组链表 1.8&#xff1a;数组链表红黑树 当链表的长度大于8时&#xff0c;数组长度大于64&#xff0c;原来的链表数据结构变为红黑树 二、HashMap中的关键属性和方法区别 方法/变量/类 JDK7 JDK8 备注 DEFAULT_INITIAL_CAPACITY 16 16…

js中的设计模式

设计模式 代码整体的结构会更加清楚&#xff0c;管理起来会更加方便&#xff0c;更好地维护 设计模式是一种思想 发布订阅 模块化开发 导入很多模块 容器即数组存储未来要执行的方法&#xff0c;同addEventListener 数组塌陷问题* 由于删除了元素&#xff0c;导致从删除元素的位…

【网络】应用层——HTTP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; &#x1f3c0;认识HTTP协议 上篇文章中&#xff0c;本喵带着大家对HTTP有了一个初步的认识&#xff0…

Java进阶之Dump文件初体验

视频地址&#xff1a;https://www.bilibili.com/video/BV1Ak4y137oh 学习文章&#xff1a;https://d9bp4nr5ye.feishu.cn/wiki/VQoAwlzrXiLFZekuLIyc1uK5nqc 最近线上频繁的内存告警&#xff0c;同事A通过分析dump文件解决了这个问题&#xff0c;我当然是不会放过这种学习的机…

【C++】做一个飞机空战小游戏(三)——模块化程序设计

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——模块化程设设计 在前两讲当中&#xff0c;介绍了利用…

深度学习实践——模型推理优化练习

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——模型推理优化练习 模型推理优化练习架构设计练习知识蒸馏练习模型剪枝练习参数量化练…

【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2

第一道栈迁移题目&#xff0c;跌跌撞撞理解了 前言 当前溢出可用空间比较少时&#xff08;极端情况下仅能覆写ebp和ret&#xff09;&#xff0c;可以通过栈迁移的方式&#xff0c;扩大shellcode的容纳空间&#xff0c;其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋…

【我们一起60天准备考研算法面试(大全)-第二十九天 29/60】【二进制】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

【SpringBoot】18张图,详解SpringBoot解析yml全流程

文章目录 加载监听器执行run方法加载配置文件封装Node调用构造器思考 前几天的时候&#xff0c;项目里有一个需求&#xff0c;需要一个开关控制代码中是否执行一段逻辑&#xff0c;于是理所当然的在yml文件中配置了一个属性作为开关&#xff0c;再配合nacos就可以随时改变这个值…

基于RASC的keil电子时钟制作(瑞萨RA)(6)----定时器驱动数码管

基于RASC的keil电子时钟制作6_定时器驱动数码管 概述硬件准备视频教程选择定时器定时器做计数器配置定时器回调函数timer_smg.ctimer_smg.h演示效果主程序 概述 要想让每个数码管显示不同的数字&#xff0c;但是数码管必须依次地被持续驱动&#xff0c;数码管之间的刷新速度应…

KY222 打印日期+KY111日期差值

一、KY222题目 二、代码 #include <climits> #include <iostream> using namespace std; class Date{public:Date(int year 1,int month 2,int day 3){_year year;_month month;_day day;}int GetDay(int year ,int month);void Define(int n);public:int _yea…

mysql的json处理

写在前面 需要注意&#xff0c;5.7以上版本才支持&#xff0c;但如果是生产环境需要使用的话&#xff0c;尽量使用8.0版本&#xff0c;因为8.0版本对json处理做了比较大的性能优化。你你可以使用select version();来查看版本信息。 本文看下MySQL的json处理。在正式开始让我们先…

从使用回溯分割字符串的技巧到前向搜索

题目 131. 分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 答案&#xff1a; class Solution {boolean[][] f;List<List<String>>…

【多模态】21、BARON | 通过引入大量 regions 来提升模型开放词汇目标检测能力

文章目录 一、背景二、方法2.1 主要过程2.2 Forming Bag of Regions2.3 Representing Bag of Regions2.4 Aligning bag of regions 三、效果 论文&#xff1a;Aligning Bag of Regions for Open-Vocabulary Object Detection 代码&#xff1a;https://github.com/wusize/ovdet…