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

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

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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数组Array】力扣-5 最长回文子串

目录 题目描述 题解labuladong 题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab"…

Spring上IOC之@EnableAspectJAutoProxy

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

〖大前端 - 基础入门三大核心之JS篇(53)〗- 构造函数与类

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

Git应用——代码提交规范 feat ,fix ,style

当前使用 feat 增加新功能fix 修复问题/BUGstyle 代码风格相关无影响运行结果的perf 优化/性能提升refactor 重构revert 撤销修改test 测试相关docs 文档/注释chore 依赖更新/脚手架配置修改等workflow 工作流改进ci 持续集成types 类型定义文件更改wip 开发中 别处看到 fea…

Mac安装Anaconda3最新实用教程

Anaconda3安装 1、Anaconda3下载 我用的是这个链接&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 可以按需要选择自己需要的版本&#xff0c;也可以自行搜索其他网站下载 下载完成之后一路默认安装就可以了。 安装好之后可以在终端试一下&#xff1a;…

Java 基础学习(八)多态、接口、造型与内部类

1 多态 1.1 多态 1.1.1 多态的意义 一个类型的引用在指向不同的对象时会有不同的实现。依然借助前面案例中的 Person类、Student类和 Teacher 类举例&#xff0c;看如下的代码&#xff1a; Person p1 new Student(); Person p2 new Teacher(); p1.schedule(); p2.schedul…

【lesson14】MySQL表的基本查询(1)

文章目录 表的基本操作介绍retrieveselect列建表基本测试 where子句建表基本测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; retrieve select列 建表 基本测试 插入数据 全列查询 …

本来以为 AI 生成视频没什么想象空间了

用 AI 来生成视频&#xff0c;以及是一件最没有想象力的事情&#xff0c;但看了两家后起之秀的 AI 视频生成厂家&#xff0c;Pika 和 Runway&#xff0c;还是小小被震撼一下&#xff0c;视频效果确实够打&#xff0c;来看看对比&#xff1a; 这里来自推友 maxescu 制作的 Pika …

【内存函数】

目录 memcpy使用和模拟实现memmove使用和模拟实现memset使用memcmp使用 1. memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num) ; 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存的位置这个函数在遇到…

【数据结构】哈希经典应用:位图——[深度解析](8)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 数据结构 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴 数据结构 专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.位图的基本概念二…

ETLCloud详解,如何实现最佳实践及问题排查

ETLCloud介绍 ETLCloud是新一代全域数据集成平台&#xff0c;领先于市场同类产品的数据集成平台(DataOps)&#xff0c;只需单击几下即可完成数据清洗转换、传输入仓等操作&#xff0c;具备高效、智能、一站式的全域数据集成优势&#xff0c;如&#xff1a; 毫秒级实时数据同步 …

《PySpark大数据分析实战》-06.安装环境准备

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

马斯克回应聊天机器人 Grok 抄 ChatGPT 作业;Figma 推出宏编程键盘丨 RTE 开发者日报 Vol.105

开发者朋友们大家好&#xff1a; 这里是「 RTE 开发者日报 」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

解决ps找不到MSVCP140.dll的5种方法,完美解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到MSVCP140.dll”。这个问题通常出现在安装Adobe Photoshop&#xff08;简称PS&#xff09;时。MSVCP140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它提供…

Openlayers 加载 Geoserver 图层以及范围过滤

Openlayers 加载 Geoserver 图层以及范围过滤 范围过滤核心代码完整代码&#xff1a;在线示例 Openlayers 加载 Geoserver 图层&#xff0c;除了会遇到属性条件查询需求&#xff0c;还经常遇到空间查询&#xff0c;这里介绍一些范围查询。 其实就是利用 Geoserver 的 CQL_FILT…

HarmonyOS应用程序框架

应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 …

深入理解Dubbo-8.Dubbo的失败重试设计

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

搭建Tomcat调试环境并分析CVE-2017-12615

准备 下载存在漏洞版本tomcat&#xff0c;这里下的是8.0.45 https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.45/ 可执行文件和源码都需要下载 用idea打开源码文件&#xff0c;然后将java目录设置为源码目录 配置一下jdk 转成maven项目 添加一些依赖 <dependencie…

DS冲刺整理做题定理(二)线性表、栈、队列的套路

继续归纳套路&#xff0c;做题练习非常重要&#xff0c;王道的基本上足够了&#xff0c;学有余力可以做一下数据结构1800~ DS冲刺整理做题定理&#xff08;一&#xff09;二叉树专题https://blog.csdn.net/jsl123x/article/details/134949736?spm1001.2014.3001.5501 目录 一…

复旦微固化流程

生成boot.bin 如图所示&#xff0c;psoc下的create boot image&#xff0c;选择文件配置路径output bif&#xff0c;任意命名 点击右侧add&#xff0c;分别添加三部分 1.编译FSBL工程后SDK\system_platform\FSBL\Debug\Exe路径下的FSBL.out 2.PL侧的bit文件 3.编译工程后SDK\sy…