数据结构与算法——Java实现排序算法(一)

news2024/11/13 15:16:44

目录

一、排序算法

 1.1 排序算法基本介绍

1.2 衡量程序执行的方法

1.2.1 事后统计法

1.2.2 事前估算的方法

二、 时间复杂度

2.1 时间频度

2.2 时间复杂度

2.2.1 常见的时间复杂度

2.2.2 常数阶O(1)

2.2.3 对数阶O(log2底n)

2.2.4 线性阶O(n)

2.2.5  线性对数阶O(nlogN)

2.2.6 平方阶O(n方)

2.2.7 立方阶O(n三次方)、K次方阶O(n的k次方)

 2.3  平均时间复杂度和最坏时间复杂度

三、空间复杂度

四、冒泡排序算法

4.1 思路分析

4.2 代码实现

4.2.1 方式1

4.2.2 方式2

4.2.3  优化

五、选择排序算法

5.1  思路分析

5.2 代码实现

六、插入排序

6.1 思路分析

6.2 代码实现

6.3 插入排序存在的问题


一、排序算法

 1.1 排序算法基本介绍

   将一组数据,依指定的顺序进行排列的过程。

   分类:

  •  内部排序:将需要处理的所有数据都加载到内部储存器中进行排序
  •  外部排序:数据量过大,无法全部加载到内存,需要借助外部存储进行排序。先加载一部分排序,完成之后再加载一部分排序合并。

    常见的排序算法

1.2 衡量程序执行的方法

1.2.1 事后统计法

   这种方法可行但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,这种方式要在同一台计算机的相同状态下运行才能比较哪个算法更快

1.2.2 事前估算的方法

通过分析某个算法的时间复杂度来判断哪个算法更优

二、 时间复杂度

2.1 时间频度

时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费的时间就对。一个算法中的语句执行次数成为语句频度或时间频度,记为T(n).

忽略常数项

 

忽略低次项

忽略系数

2.2 时间复杂度

    一般情况下,算法中的基本操作语句的执行次数是问题规模n的某个函数,用T(n)表示,若某个辅助函数f(n),使得n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)和T(n)的同数量级函数。记作T(n)=0(f(n)),称0(f(n))为算法的渐进时间复杂度,简称时间复杂度。

 

 2.2.1 常见的时间复杂度

常数阶其实是最好的

2.2.2 常数阶O(1)

 无论代码执行多少行,只要没有循环等复杂结构,那这个代码的时间复杂度都是O(1)

 上述的代码在执行过程中,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码多长,即是有几万几十万行,都可以用O(1)来表示它的时间复杂度

2.2.3 对数阶O(log2底n)

 这个地方牵扯了高中的一个基础知识,如果不太懂可以看看log相关数学基础知识

2.2.4 线性阶O(n)

  此代码for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的

  因此这类代码可以用O(n)来表示它的时间复杂度

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

}

2.2.5  线性对数阶O(nlogN)

这个也是很好理解的, 单个while循环是O(log2底n),但是外面的for循环是O(n),所以为O(nlogn)



for(m =1;m<n;m++){
   i=1;
   while(i<n){
     i=i*2;
   }

}

2.2.6 平方阶O(n方)

for(x=1;i<=n;x++){

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

}

 2.2.7 立方阶O(n三次方)、K次方阶O(n的k次方)

   三层for循环、多层for循环

 2.3  平均时间复杂度和最坏时间复杂度

  • 平均时间复杂度:指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
  • 最坏时间复杂度:最坏情况下的时间复杂度,一般讨论的时间复杂度均是最坏情况下的时间复杂度。

      原因是,最坏情况下的时闻复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。

  • 平均时间复杂度和最坏时间复杂度是否一致,和算法有关(如图:).

三、空间复杂度

  • 类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模 n 的函数。
  • 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的2)临时工作单元数与解决问题的规模 n有关,它随着  的增大而增大,当n 较大时,将占用较多的存储单元,例如快速排序和归并排序算法,基数排序就属于这种情况
  • 在做算法分析时,主要讨论的是时间复杂度。从用户使用体验上看,更看重的程序执行的速度一些缓存产品(redis,memcache)和算法(基数排序)本质就是用空间换时间



 

四、冒泡排序算法

    基本思想:通过对待排序序列从前往后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换

   简言之: 较大元素从前往后移动。

    优化:(这里是等冒泡排序写好后再进行优化 )因为排序过程中,哥哥元素不断接近自己的位置,如果一趟下来没有进行交过,就说明序列有序。因此在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的麻烦。

4.1 思路分析

 为什么会循环数组大小的n-1次呢?

     因为最后一个就不用比了,一定是最小的,放在原位置就行了,比也没有用,这是在这个位置

4.2 代码实现

4.2.1 方式1

第一个for循环相当于是第几趟排序,第二个for循环相当于第几趟排序里面的小交换

public class BubbleSort {
    public static void main(String[] args) {
        int arr[] ={3,9,-1,10,-2};
        int temp;

//      外层在此时循环arr.length-1次,因为剩下一个数不用比也知道他是最小的了
        for(int i=arr.length-1;i>0;i--){
//          下面的for循环就是找出每次比较结果中最大的放到右侧
//          如果i是4的话,就比较4次,我们筛选出来的最大的就不用比较了
            for(int j=0;j<i;j++){
//          前面的数比后面的数大,就交换
                if(arr[j]>arr[j+1]){
                    temp =arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }

        }
        System.out.println(Arrays.toString(arr));
        
    }
}

4.2.2 方式2

        int arr[] ={3,9,-1,10,-2};
        int temp;

        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
//          前面的数比后面的数大,就交换
                if(arr[j]>arr[j+1]){
                    temp =arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }

            }
        }
        System.out.println(Arrays.toString(arr));

4.2.3  优化

        int arr[] ={3,9,-1,10,-2};
        boolean flag =false;
        int temp;

        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
//          前面的数比后面的数大,就交换
                if(arr[j]>arr[j+1]){
                    flag = true;
                    temp =arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            if(!flag){
//               如果运行到这里是false,说明根本没走上面的for循环进行交换,即顺序已经确定
//               说明我们的第二个for循环中一次也没交换,说明已经成功排序完成了
                break;
            }else {
//              重置flag,以防对下次判断产生影响
                flag = false;
            }
        }
        System.out.println(Arrays.toString(arr));

五、选择排序算法

选择排序也属于内部排序法,是从想要排序的数据中,按指定的规则选出某一个元素,再依照规定交换位置后达到排序的目的。

5.1  思路分析

简要的说:我们并不需要每一次比较都交换两个数,我们只需要转换最小的那个数和我们想要换到的那个位置上的数就行,这样省去中间很多次的交换

5.2 代码实现

效率要比冒泡排序算法快很多很多

        int arr[] ={3,9,-1,10,-2};
        boolean flag =false;
        int temp;
//      我们先把数组下标为0的数定为最小的数
        int min ;
        int index=0;

//      数组中有几个数,就要有n-1次大排序
        for(int i=0;i<arr.length-1;i++){
            min=arr[i];
            index=i;
//          一直比到尾部,所以是j<arr.length
//          我们把最小的放到左边,所以已经放的就不放了,故从 j=i开始
            for( int  j=i;j<arr.length;j++){
                if(arr[j]<min){
//                 这样的目的就是找出最小数
                    min = arr[j];
                    index=j;
                }
            }
            if(index !=i){
                arr[index] = arr[i];
                arr[i]= min;

            }
//            if(arr[i] != min){
//                temp = arr[i];
//                arr[i]=arr[index];
//                arr[index]=temp;
//            }
        }
        System.out.println(Arrays.toString(arr));


六、插入排序

   插入式排序属于内部排序法,是对于想要排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的

  6.1 思路分析

   基本思想:把n个待排序的元素看成为一个有序表,一个无序表,开始时有序表中只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出一个元素,把他的排序码一次与有序元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表

下面是从小到大的排序方法

6.2 代码实现

public class InsertSort {
    public static void main(String[] args) {
        int[] arr ={101,34,119,1};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static  void insertSort(int[] arr){
//      代表我们接下来要插入的数据
        int insertVal;
//      我们要将数据插入在下标为几处
        int insertIndex;

//      这个和之前的不一样,我们这里i<arr.length,一定要注意
//      我们要从i=1开始遍历插入,因为插入第一个的时候根本就不需要比较,直接插入记性
//      因为我们省去了i=0这一次循环,故我们循环结束条件是i<arr.length
        for(int i=1;i<arr.length;i++){

            insertVal=arr[i];
//          初始时是待插入位置的前一个位置,是i的前一个,故是i-1
            insertIndex=i-1;

//          insertIndex>=0 保证下标不越界
//          insertVal<arr[insertIndex]
//          循环一下,目的就是找到要插入的前一个位置index
            while(insertIndex>=0 && insertVal<arr[insertIndex]){
//              insertVal<arr[insertIndex]表示我们还没有找到插入的位置,因为我们想把大的一次性插入到位
//              所以我们先要让insertIndex位置处的数往后移动一个元素
//              有人回想,那这样insertIndex+1,insertIndex这两处这不都是一个样的数了?
//              没关系,我们最终会把insertIndex位置处的元素替换成insertVal
                arr[insertIndex+1] =arr[insertIndex];
                insertIndex--;
            }

//          当我们退出while循环的时候,说明插入的位置找到了
//          为什么要insertIndex+1?因为我们while循环最后一次执行完成之后-1了
//          换句简单的来说,insertIndex本来我们规定的含义就是我们插入的前一个位置,则insertIndex+1便是我们要插入的位置
            if(insertIndex+1!=i){
                arr[insertIndex+1] = insertVal;
            }

        }
    }
}

6.3 插入排序存在的问题

 如果有一个数很小,而这个数恰好在后面,则需要移动很多次才可以完成这个操作

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

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

相关文章

2022年PAT冬季甲级考试 25 A-3 Articulation Points

A-3 Articulation Points 分数 25 In graph theory, given a connected graph G, the vertices whose removal would disconnect G are known as articulation points. For example, vertices 1, 3, 5, and 7 are the articulation points in the graph shown by the above fi…

WAYON维安功率肖特基二极管,适配器领域的助推器

WAYON维安功率肖特基二极管&#xff0c;适配器领域的助推器。 维安功率肖特基二极管&#xff0c;适配器领域的助推器 导言 肖特基二极管&#xff0c;是以它的发明人肖特基博士名字而命名的&#xff0c;又被称作是肖特基势垒二极管。它是金属与半导体材料相互接触&#xff0c;且…

C++:类和对象:C++对象模型和 this指针

1&#xff1a;成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储&#xff0c;只有非静态成员变量才属于类对象。 案例&#xff1a;我们写一个空类&#xff0c;然后创建一个对象&#xff0c;看看这个空对象占用多大空间。 #include<iostream…

做全表扫描时数据表的内存大于 MySQL 内存,会不会被打爆?

我查这么多数据&#xff0c;会不会把数据库内存打爆&#xff1f; 我的数据库内存只有10G&#xff0c;现在我要对一个20G的大表做全表扫描&#xff0c;会不会把数据库内存&#xff08;buffer pool&#xff09;占满然后报OOM的错误&#xff1f; 答案是不会的。 InnoDB的数据是…

【图像处理 -1图像恢复】非线性过滤器修复图像

【论文参考】文章地址&#xff1a; https://www.researchgate.net/publication/303996052_Image_Restoration_Technique_with_Non_Linear_Filter Image Restoration 一、摘要 在本文中&#xff0c;提出了一种新的处理方法图像使用不同的过滤方法 实现Image恢复。目的是增强数…

计算机网络原理第4章 网络层

目录~ 4.1 网络层提供的两种服务 面向连接&#xff1a;让网络负责可靠交付&#xff0c;通信之前先建立虚电路 无连接&#xff1a;网络提供数据报服务&#xff0c;网络层提供简单灵活的、无连接的、尽最大努力交付的数据报服务 4.2 网际协议 IP 网际协议 IP 是 TCP/IP 体系…

基于JAVA的校友录

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系我们、校园通知、组织信息、活动信息 管理员功能&#xff1a; 1、管理关于我们、联…

java方法耗时统计,JavaAgent javassist bytebuddy统计方法耗时,jvm监控prometheus

前言介绍 JavaAgent是在JDK5之后提供的新特性&#xff0c;又叫叫java代理。开发人员可通过这种机制(Instrumentation)在jvm加载class文件之前修改类的字节码&#xff0c;动态更改类方法实现AOP&#xff0c;提供监控服务如&#xff1a;方法调用时长、jvm内存等。修改字节码领域…

jsp+ssm计算机毕业设计大学生校园新闻发布系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

色温及其相关参数

光学膜层和大多数着色表面不是自发光的。为了看到它们&#xff0c;我们需要一个光源。显然&#xff0c;对颜色的任何评估都将包括光源的属性。在计算颜色时&#xff0c;我们通常使用标准光源&#xff0c;其中大部分是由CIE根据其相对光谱输出来定义的&#xff0c;并且尽可能地表…

java计算机毕业设计springboot+vue在线选课系统

项目介绍 本系统是针对目前在线选课系统管理的实际需求,从实际工作出发,对过去的在线选课系统系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概…

ARM寻址方式(ARM指令获取操作数的方式)

所谓寻址方式&#xff0c;指的是CPU去获取一个操作数的方式&#xff0c;可以是从指令中获取立即数、可以是从寄存器中获取&#xff0c;也可以是从内存中获取。 目录 1、立即数寻址 2、寄存器寻址 3、寄存器移位寻址 4、寄存器间接寻址 5、基址加变址寻址 (1) 前向索引…

springboot-mybatis/JPA流式查询

项目中有几个batch需要检查所有的用户参与的活动的状态&#xff0c;以前是使用分页&#xff0c;一页一页的查出来到内存再处理&#xff0c;但是随着数据量的增加&#xff0c;效率越来越低。于是经过一顿搜索&#xff0c;了解到流式查询这么个东西&#xff0c;不了解不知道&…

计算机毕业设计springboot+vue基本微信小程序的演出门票管理系统-票务转票系统

项目介绍 转票是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,转票也在发生着变化,单就出票这一方面,利用手机预约考试正在逐步进入人们的生活。传统的转票方式,不仅会耗费大量的人力、时间,有时候还会出错。小程序系统伴随智能手机为我们提供了新的方向。手机微信…

新兴物种:程序猿的饲养指南

程序猿&#xff0c;一种主要生存在中国印度等亚太国家的新型猿类&#xff0c;生存活动以及消费活动的范围遍布世界各地&#xff0c;其中最优渥的产地位于美国硅谷。 主要的生存环境需求有&#xff0c;两脚兽一切的日用饮食以及物资需求。 该物种所获得的荣誉勋章有&#xff0…

Spring系列之SpringBoot概述及入门

SpringBoot入门 文章目录SpringBoot入门一、SpringBoot是什么&#xff1f;二、Spring的缺点1.配置繁琐2.依赖繁琐三、SpringBoot功能四、SpringBoot起步依赖原理五、SpringBoot快速入门总结一、SpringBoot是什么&#xff1f; SpringBoot是由Pivotal团队提供的全新框架&#xf…

Splunk Enterprise 9.0.X Crack

Splunk Enterprise 9.0.X Crack Splunk 有能力了解用户小型企业中实际发生的情况&#xff0c;并快速采取有目的的行动来了解用户和开发人员的情况。它能够轻松灵活地将简单信息转化为答案&#xff0c;以及自动机器学习支持的分析过程 搜索、分析和可视化&#xff0c;从您的所…

基于springcloud的简单易用的java分布式日志组件

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 基于springcloud的简单易用的java分布式日志组件 二、实现功能 支持基于traceId的日志记录 支持日志查询 支持日志缓冲队列 redis或者kafka 支持错误报警模块 支持内容组合查询功能 支持日志分应用统计条数…

【神奇bug】“金”、“⾦”不是同一个字

身为程序员&#xff0c;总能遇见那些神奇的bug。我前段时间遇到了 “中国黄金” 和 “中国黄⾦”&#xff0c;我咋看咋觉得是同一个词&#xff0c;但是程序就是判定不一致&#xff0c;十分郁闷&#xff0c;多方搜索&#xff0c;最后发现2个金居然不是一个字。真是个神奇的bug&a…

计算机基础学习笔记:操作系统篇之硬件结构,CPU Cache基础概念

三、CPU Cache的数据结构和读取过程 本文知识来源小林Coding阅读整理思考&#xff0c;原文链接请见该篇文章 Cache结构 CPU Cache 是由很多个 Cache Line 组成的&#xff0c;Cache Line 是 CPU 从内存读取数据的基本单位&#xff0c;而 Cache Line 是由各种**标志&#xff08;…