基础算法(1):排序(1):选择排序

news2024/12/23 23:50:18

     今天对算法产生了兴趣,开始学习基础算法,比如排序,模拟,贪心,递推等内容,算法是很重要的,它是解决某个问题的特定方法,程序=数据结构+算法,所以对算法的学习是至关重要的,它可以提高程序效率,不同的算法也是有优劣的,如何进行评价,这也是我们需要知道的,我会在学习中穿插这种评价方法,下面让我们看看第一个基础算法排序中的选择排序。

1.选择排序的实现

     选择排序(SelectionSort)算法的工作原理是每一次遍历从待排序的元素中选出最小(或最大)的一个元素,将其放在已经排好序的数列之后,直到全部排好序为止。

     其核心就是选择和交换,流程如下:

      假如给定初始数据 8 4 2 7 3(红色为每次遍历交换的数据)

      第一次排序 2 4 8 7 3

      第二次排序 2 3 8 7 4

      第三次排序 2 3 4 7 8

      首先在未排序序列中找到最小(或最大)元素,放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾,直到所有元素全部排好序。

      逻辑是这样:

   (1)第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换
   (2)第二轮从下标为 2 到下标为 n-1 的元素中选取最小值,若小于第二个数,则交换
        依次类推下去……

      我们可以再看一个动画演示加深对过程的理解,本图非本人所作,借鉴别人的。

       下面是代码实现:

void selectionSort(int arr[],int len)
{
  int i,j,min,temp;
  for(i=0;i<len-1;i++)
 {
     min=i;//先定义一个最小值对应的下标
     for(j=i+1;j<len;j++)
   {
         if(arr[min]>arr[j])//如果大于就更新最小值对应的下标
         {
            min=j;
         }
    }
      temp=arr[min];//循环结束,找到本次待排序序列的最小值,和序列首元素进行交换,之后进入下一次循环
      arr[min]=arr[i];
      arr[i]=temp;
    
  }
}
    

       或者下面这个版本

void selectSort(int arr[], int n) {
    if(n==0||n==1)return;
    int i, j, minIndex;
    for (int i = 0; i < n - 1; i++) {
        minIndex = i;//先定义最小值对应的下标
        for (int j = i + 1; j < n-1; j++)
        {
            minIndex = arr[j] < arr[minIndex] ? j : minIndex;//如果小于就更新最小值下标
        }
        int temp=arr[min];//循环结束,找到本次待排序序列的最小值,和序列首元素进行交换,之后进入下一次循环
        arr[min]=arr[i];
        arr[i]=temp;
    }
}

2.选择排序的时间复杂度

      时间复杂度?这是什么玩意?别搞我啊?可能大家在看到这个词的心理状态是这样的,但你先别急。

2.1 时间复杂度

       时间复杂度是用来评价算法性能的,它是用来方便开发者估算程序的运行时间,我们如何估计程序运行时间呢?我们通常会估计算法的操作单元数量,来代表程序消耗的时间

      假设算法道德问题规模为n,那么操作单元数量就用函数f(n)来表示,随着n的增大,算法执行时间的增长率和f(n)的增长率相同,这就称作算法的时间复杂度,记为O(f(n))。

      大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。

  2.2 如何描述时间复杂度

      

      

     决定使用哪个算法不仅仅要考虑时间复杂度,不是时间复杂越低的越好,要考虑数据规模,如果数据规模很小,甚至可以用O(n^2)的算法比 O(n)的更合适,就像上图中图中 O(5n^2) 和O(100n) 在n小于2的时候 O(5n^2)是更优的,所花费的时间也是最少的。

     那我们为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,并且要默认O(n) 优于O(n^2) 呢 ?

     因为大O其实就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,也就是刚才说的上界,在这个时候,常数项系数已经不起决定性作用了,所以可以省略。

     例如上图中 20 就是那个点 ,n只要大于20 常数项系数已经不起决定性作用了,其实也包括除最高次数项的其他项。

     所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下我们都是默认数据规模足够的大,基于这样的事实 我们给出的算法时间复杂的的一个排行如下所示:

     O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

     这里只是大概列出概念,后面会专门写一篇来讲这方面的问题。

2.3 选择排序的时间复杂度

     从上面的代码我们可以知道选择排序套用了两个循环:

for(i=0;i<n-1;i++)
{
    
     for(j=i+1;j<n;j++)
   {

   }

}

     很显然问题规模是n,问题规模就是需要解决问题处理数据量的大小,显然是处理n个元素的排序问题,规模为n。

     当i=0时,下面内循环比较n-1次,每次i+1下面内循环比较n-i次,因此总共循环次数(操作单元数量)为(n-1)+(n-2)+......+2+1=n^2/2,舍去最高项系数,时间复杂度为O(n^2)

3.leetcode题目

3.1 颜色分类

    

void sortColors(int* nums, int numsSize) {
    int i,j,min,temp;
   for(i=0;i<numsSize-1;i++)
  {
     min=i;
     for(j=i+1;j<numsSize;j++)
     {
         if(nums[min]>nums[j])
         {
            min=j;
         }
     }
      temp=nums[min];
      nums[min]=nums[i];
      nums[i]=temp;
  }
}
   

      这个没什么好说的,就是排序,太水了,模板题。

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

int dominantIndex(int* nums, int numsSize) {
    if(numsSize==1)return 0;
    int max=0;
    for(int i=0;i<numsSize;i++)
    {
        if(nums[max]<nums[i])max=i;
    }
     int minindex=0;
    for(int i=0;i<numsSize-1;i++)
    {
        minindex=i;
        for(int j=i+1;j<numsSize;j++)
        {
            minindex=nums[j]<nums[minindex]?j:minindex;
        }
        if(i!=minindex)
        {
            int temp=nums[i];
            nums[i]=nums[minindex];
            nums[minindex]=temp;
        }
    }
        if(nums[numsSize-1]>=2*nums[numsSize-2])return max;
        else return -1;
}

      这个题也不难,关键在于我们要先记录最大数对应的下标,因为我们排序后会破坏原来的顺序,再就是我们只需要判断排序后最后一个数是不是至少是前一个数的两倍,如果这个满足,那这个最大数也必然是其他是的至少两倍。

3.3 判断能否形成等差数列

bool canMakeArithmeticProgression(int* arr, int arrSize) {
     for(int i=0;i<n;i++)
    {
        int minindex=i;
        for(int j=i+1;j<n;j++)
        {
            minindex=nums[j]<nums[minindex]?j:minindex;
        }
            int temp=nums[i];
            nums[i]=nums[minindex];
            nums[minindex]=temp;
    }
    int d=arr[1]-arr[0];
    for(int i=2;i<arrSize;i++)
    {
       if((arr[i]-arr[i-1])!=d)return false;
    }
    return true;
}

    这个题就是先排序,这样我们就可以很容易的判断,先假定公差为前两个数之差,如果遍历后面相邻两个数之差等于该公差,那说明是等差数列,否则不是。

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

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

相关文章

【知网稳定检索】第三届人文,智慧教育与服务管理国际学术会议(HWESM 2024)

第三届人文&#xff0c;智慧教育与服务管理国际学术会议&#xff08;HWESM 2024&#xff09; 2024 3rd International Conference on Humanities, Wisdom Education and Service Management 第三届人文&#xff0c;智慧教育与服务管理国际学术会议&#xff08;HWESM 2024&…

LangChain学习二:提示-实战(上半部分)

文章目录 上一节内容&#xff1a;LangChain学习一&#xff1a;模型-实战学习目标&#xff1a;提示词及提示词模板的运用学习内容一&#xff1a;什么是提示词&#xff1f;学习内容二&#xff1a;提示词模板2.1 入门2.2 模板格式2.3 验证模板2.4 序列化提示模板2.5 将少量示例传递…

Linux 高级管理,MySQL服务器的构建与维护

实验环境 某公司因业务范围日益扩大&#xff0c;最近订购了一套基于B/S架构的电子商务系统&#xff0c;在正式部署之前&#xff0c;要 求对现有的httpd服务器进行改造&#xff0c;首先需要增加MySQL数据库服务。 需求描述 1. 编译安装MySQL服务器&#xff0c;并添加为mysqld系…

Centos7防火墙及端口开启

1、防火墙 1.1、查看防火墙是否开启 systemctl status firewalld 1.2、开启防火墙 firewall-cmd --list-ports 1.3、重启防火墙 firewall-cmd --reload 2、端口 2.1、查看所有已开启的端口号 firewall-cmd --list-ports 2.2、手动开启端口 启动防火墙后&#xff0c;默认没有开…

Mybatis-Plus源码解析之MybatisPlusAutoConfiguration(二)

group : com.baomidou version:3.5.2.2-SNAPSHOT SpringBoot是自动装配。Spring则可以在配置类上Import(MybatisPlusAutoConfiguration.class) org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageD…

如何想成为嵌入式工程师?(这些东西您必须知道)

嵌入式的发展怎么样&#xff1f; 嵌入式系统领域一直在迅速发展&#xff0c;伴随着物联网、智能设备、汽车电子、医疗设备等应用的不断增加&#xff0c;对嵌入式技术的需求也在不断扩大。因此&#xff0c;嵌入式领域仍然是一个充满机会的领域&#xff0c;为专业人士提供…

AC修炼计划(AtCoder Beginner Contest 332)

传送门&#xff1a;AtCoder Beginner Contest 332 - AtCoder a,b,c都还是很基础了。d题是一个bfs的纯暴力问题。 E - Lucky bag 看看范围&#xff0c;n15&#xff0c;第一个想法是dfs纯暴力&#xff0c;但所有的情况太大&#xff0c;各种决策层出不穷&#xff0c;会t。所以转…

黑马程序员Javaweb重点笔记(五)(2023版)

文章目录 前言事务管理事务进阶AOPAOP基础 前言 我个人有一个学习习惯就是把学过的内容整理出来一份重点笔记&#xff0c;笔记往往只会包括我认为比较重要的部分或者容易忘记的部分&#xff0c;以便于我快速复习&#xff0c;如果有错误欢迎大家批评指正。 另外&#xff1a;本篇…

GetGuru替代方案:4个理由告诉你为什么选择HelpLook

随着知识管理在现代企业中的重要性日益凸显&#xff0c;选择一款高效、稳定的知识库软件成为了关键。然而&#xff0c;市场上的知识库软件众多&#xff0c;如何选择适合自己的产品呢&#xff1f;本文将为你介绍GetGuru的替代方案——HelpLook&#xff0c;并从四个方面为你分析为…

大数据机器学习深度解读决策树算法:技术全解与案例实战

大数据机器学习深度解读决策树算法&#xff1a;技术全解与案例实战 本文深入探讨了机器学习中的决策树算法&#xff0c;从基础概念到高级研究进展&#xff0c;再到实战案例应用&#xff0c;全面解析了决策树的理论及其在现实世界问题中的实际效能。通过技术细节和案例实践&…

学习深度强化学习---第2部分----RL动态规划相关算法

文章目录 2.1节 动态规划简介2.2节 值函数与贝尔曼方程2.3节 策略评估2.4节 策略改进2.5节 最优值函数与最优策略2.6节 值迭代与策略迭代2.7节 动态规划求解最优策略 本部分视频所在地址&#xff1a;深度强化学习的理论与实践 2.1节 动态规划简介 态规划有两种思路&#xff1…

20章节多线程

20.1线程简介 世间有很多工作都是可以同时完成的。例如&#xff0c;人体可以同时进行呼吸、血液循环、思考问题等活用户既可以使用计算机听歌&#xff0c;也可以使用它打印文件。同样&#xff0c;计算机完全可以将多种活动同时进这种思想放在 Java 中被称为并发&#xff0c;而将…

文件系统理解

先前的博客我写了关于缓冲区的理解&#xff0c;顺便提及了在内存的文件是怎样管理的&#xff0c;本文就来描述在磁盘上的文件是怎么样。但要先了解了解磁盘。 在笔记本上机械磁盘被固态硬盘代替&#xff0c;因为固态硬盘更快&#xff0c;而且方便携带&#xff0c;机械硬盘若是受…

使用Selenium库模拟浏览器操作

Selenium是一个用于自动化Web浏览器的Python库。它提供了一组强大的工具和API&#xff0c;使开发者能够以编程方式控制浏览器的行为&#xff0c;模拟用户与网页的交互。 Selenium可以用于各种Web自动化任务&#xff0c;包括网页测试、数据采集、UI自动化等。它支持主流的Web浏览…

C#实现支付宝转账功能

环境 .net 6 AlipaySDKNet.OpenAPI 2.4.0 申请证书 登录支付宝开放平台https://open.alipay.com/ 进入控制台 授权回调地址也设置一下&#xff0c;加密方式AES 新建.net 6空白的web项目 证书除了java都需要自己生成一下pkcs1的密钥 privatekey.txt就是根据应用私钥生成…

揭开苹果3兆美元市值的秘密:创新因素

苹果公司的创新战略如何使其在竞争中脱颖而出&#xff1f;并成为当今全球用户最追捧的品牌&#xff0c;拥有各个人群中最忠诚的客户基础。苹果公司的市值超过$3万亿以及百亿美元净利&#xff0c;彰显了这家世界上最具创新力的公司的实力。从标志性的麦金塔到iPod、iPhone和iWat…

SQL小技巧3:分层汇总

前几天&#xff0c;QQ学习群有个小伙伴问我一个使用SQL分层汇总的问题。 今天正好分享下。 需求描述 在数据报表开发的工作中&#xff0c;经常会遇到需要对数据进行分组汇总的情况。 假设有一个销售数据表sales&#xff0c;包含列region&#xff08;地区&#xff09;、mont…

与「高通」最像的芯片公司出道,杀入主流智驾芯片市场

作者 |德新 编辑 |王博 单芯片全时行泊一体 上个月&#xff0c;AI芯片研发及基础算力平台公司爱芯元智推出面向车载智能驾驶领域的品牌「爱芯元速」。这意味着这家创办四年多&#xff0c;累计融资近20亿元的芯片公司正式进军车载市场。 实际上&#xff0c;爱芯元速序列的第一…

算法导论复习(二)

算法导论第二次复习以 分治法 为专题 文章目录 分治算法是什么归并排序Strassen矩阵乘法最近点对 求解递推表达式 分治算法是什么 归并排序 代码如下&#xff1a; #include <iostream> #include <vector>using namespace std;// 归并函数&#xff0c;将两个有序数…

k8s debug 浅谈

一 k8s debug 浅谈 说明&#xff1a; 本文只是基于对kubectl debug浅显认识总结的知识点,后续实际使用再补充案例 Kubernetes 官方出品调试工具上手指南(无需安装&#xff0c;开箱即用) debug-application 简化 Pod 故障诊断: kubectl-debug 介绍 1.18 版本之前需要自己…