12.1排序

news2025/1/11 11:16:07

目录

0.修改栈堆内存

一.堆排序

1 原理

2.代码实现

3.分析

二.冒泡排序

1 原理

2.实现

3.分析

三.快速排序(重要)

1 原理-总览

2.方法:挖坑法

步骤一

步骤二

步骤三

步骤四

步骤五

步骤六

3.代码实现挖坑法

4.分析

四.字符串转整数

1.字符串方法

2.字符数组方法

3.sb方法

五.笔试强训


0.修改栈堆内存

一.堆排序

1 原理

基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。

注意: 排升序要建大堆;排降序要建小堆

2.代码实现

/**
 * 堆排序
 */
public static void heapSort(int[] array){
    createHeap(array);
    int end=array.length-1;
    while(end>0){//等于0的时候就不需要调整了
        swap(array[0],array[end]);
        shiftDown(array,0,end);
        end--;
    }
}
public static void createHeap(int[] array) {
    for (int parent =(array.length-1-1)/2; parent >=0 ; parent--) {
        shiftDown(array,parent,array.length);
    }
}
public static void shiftDown(int[] array,int parent,int len){
    int child=parent*2+1;

    while(child<len){
        if(child+1<len&&array[child]<array[child+1]){
            child++;
        }
        if(array[child]>array[parent]){
            swap(array[child],array[parent]);
            parent=child;
            child=parent*2+1;
        }else{
            break;
        }
    }
}

3.分析

/**
 * 堆排序
 */
/**
 * 时间复杂度:O(N * log N)
 *
 * 空间复杂度:O(1)
 *
 * 稳定性:不稳定
 *
 * 面试 写堆排序  就是 写的调整过程
 *
 * @param array
 */

因为要遍历每个元素所以就是n然后最坏情况下要从上往下一直调整就是树的高度logn

所以就是 时间复杂度:O(N * log N)

二.冒泡排序

1 原理

在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序

2.实现

/**
 * 冒泡排序
 */
public static void bubbleSort(int[] array) {
    for (int i = 0; i < array.length; i++) {
        //int max=i;
        int j = i+1;
        boolean flg=true;
        for (; j < array.length-i-1; j++) {
            if(array[j]>array[j+1]){
                swap(array[j],array[j+1]);
                flg=false;
            }
        }
        if(flg) return;
    }
}

3.分析

/**
 * 冒泡排序
 * 时间复杂度:O(N^2)
 * 有序情况下:O(n)
 * 空间复杂度:O(1)
 * 稳定性:稳定的排序
 * @param array
 */

三.快速排序(重要)

1 原理-总览

  1. 从待排序区间选择一个数,作为基准值(pivot);
  2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可

以包含相等的)放到基准值的右边;

3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间

的长度 == 0,代表没有数据。

2.方法:挖坑法

步骤一

先定义数组第一个元素tmp.挖坑

步骤二

再定义两个指针一个是end另外一个是start

步骤三

遍历end 如果比tmp大的end就往右移 也就是end--

遇到比tmp小的就放到坑里

停止遍历

步骤四

遍历start,遇到比tmp小的就左移,也就是start++

遇到比tmp大的就放在end所在坑里

停止遍历

步骤五

直到start与end相遇那么这个位置放入tmp的值,

这个位置也是基准

这样就发现基准的左边就比他小.基准的右边就比他大

步骤六

分而治之,再次递归.分别对基准的左边和右边做同样的行为

再次递归发现.3右边只有一个元素或者没有元素,就代表有序了.4默认有序

3.代码实现挖坑法

第一步 快排的时候需要找基准

第二步,分别递归左边和右边

左边:

右边

第三步 递归结束条件

也就是left>=right

/**
 * 快速排序
 */
public static void quickSort(int[] array) {
    quick(array,0,array.length-1);
}
public static void quick(int[]array,int left,int right){
    if(left>=right) return;

    int pivot=partition(array,left,right);

    quick(array,left,pivot-1);//分支左边
    quick(array,pivot+1,right);
}
public static int partition(int[] array,int start,int end){
    int tmp=array[start];
    while(start>end){
        if(start>end&&array[end]>tmp){
            end--;
        }
        //end遇到tmp小的,就放到start的位置
        array[start]=array[end];
        if(start>end&&array[start]<=tmp){
            start++;
        }
        //start遇到比tmp大的,就放到end的位置
        array[end]=array[start];
    }
    //到这里,start与end相遇
    array[start]=tmp;
    return start;
}

4.分析

每一层都需要n 一共有logn 所以就是相乘

空间复杂度就是

  * 时间复杂度:
       * 最好【每次可以均匀的分割待排序序列】:O(N*logn)
* 最坏:数据有序 或者逆序的情况 O(N^2)
* 空间复杂度:
       * 最好:O(logn)
* 最坏:O(n)   单分支的一棵树
* 稳定性:不稳定的排序
* @param array
*/

最坏的情况下就是有序的树,

他是数据敏感的

跟对排类似,但是前面的k要小

如果对空间复杂度没有要求.用快排

对空间复杂度又要求 用堆排或者归并

不可以不取等号

不然的话,遇到两个数相等的情况,进不了if语句

end和start就一直互相换

因为递归需要在栈上开辟内存,

idea可以设置栈的大小

四.字符串转整数

先看几种情况

字符串底层是一个数组

是被final修饰不可以改.

字符串转整数如果用自带的方法就是

Integer.valueof(String)

如果自己用就是

要注意这两种情况的关系

一个是不指向任何对象.一个是有对象,但是对象里面是空的

1.字符串方法

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String str=sc.nextLine();
            if(str==null||str.isEmpty()) return;
            int flg=0;
            if(str.charAt(0)=='+'){
                flg=1;
            }
            if(str.charAt(0)=='-'){
                flg=-1;
            }
            int sum=0;
            for(int i=0;i<str.length();i++){
                if(i==0){
                    if(flg==0){
                      if(str.charAt(i)<'0'||str.charAt(i)>'9'){
                          //System.out.println(sum);
                        break;
                      }
                        if(str.charAt(i)==0){
                            break;
                        }
                      sum=(str.charAt(i)-'0');
                    }
                }else{
                   if(str.charAt(i)<'0'||str.charAt(i)>'9'){
                        sum=0;break;
                    }
                    sum=sum*10+(str.charAt(i)-'0');
                }
            }
            if(flg==0) flg=1;
            System.out.println(flg*sum);
        }
    }
}

因为字符串本身不能改变所以只能用这样的方式不停地比较.

如果用字符数组把第一个是+-号的改成0即可.

2.字符数组方法

import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        //Scanner sc=new Scanner(System.in);
        if(str==null||str.isEmpty()) return 0;
            int sum=0;
          // String str=sc.nextLine();
           char[] arr=str.toCharArray();
            int flg=1;
            if(arr[0]=='+'){
              //  flg=1;
                arr[0]='0';
            }
            if(arr[0]=='-'){
                flg=-1;
                arr[0]='0';
            }
            for(int i=0;i<arr.length;i++){
                if(arr[i]<'0'||arr[i]>'9'){
                    sum=0; break;
                }
                sum=sum*10+arr[i]-'0';
            }
            return sum*flg;
        
    }
}

3.sb方法

import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        if(str.length()==0) return 0;
    StringBuilder sb=new StringBuilder();
        if(str.charAt(0)!='+'&&str.charAt(0)!='-'){
            if(str.charAt(0)>='0'&&str.charAt(0)<='9'){
                sb.append(str.charAt(0));
            }else{
                return 0;
            }
         }//不是加减的情况
        int flg=1;
         if(str.charAt(0)=='-'){
            flg=-1;
        }
        for(int i=1;i<str.length();i++){
            if(str.charAt(i)<'0'||str.charAt(i)>'9'){
                return 0;
            }else{
                   sb.append(str.charAt(i));
                }
            }
       sb.reverse();
       int sum=0;
       int m=1;
       int n=0;
       for(int i=0;i<sb.length();i++){
            n=(int)sb.charAt(i)-48;
                sum+=n*m;
                m*=10;
         }
            return sum*flg;
    }
}

五.笔试强训

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

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

相关文章

【C++重点语法下】可变参数模板,STL里面的push_back和emplace_back区别 ,包装器function,bind

目录 1.可变参数模板 1.1取出参数包内的参数方法一&#xff1a; 1.2取出参数包内的参数方法二&#xff1a; 1.3STL里面的push_back和emplace_back区别 2.包装器function 2.1function&#xff08;头文件functional&#xff09; 2.1.1可调用类型和包装器 2.1.2类的成员函数…

实验十 符号计算基础与符号微积分(matlab)

目录 实验十 符号计算基础与符号微积分 1.1实验目的 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1.2实验内容 符号计算基础与符号微积分 课本第372页 1.3流程图 1.4程序清单 实验十 1 clear xsym(6); ysym(5); z(1x)/(sqrt(…

第9章 登录页面的跳转实现

1 “swg-login.html”登录按钮不能触发异常 由于.Net框架默认支持“HTTPS”协议从而导致“swg-login.html”登录按钮不能触发&#xff0c;其异常信息如下&#xff1a;“Mixed Content: The page at https://localhost:7037/swg-login.html was loaded over HTTPS, but requeste…

FinalShell软件连接成功后,root文件夹显示一直加载中....

出现这样的问题就是因为我们一开始进入的用户是普通用户&#xff0c;然后你就会想着使用su命令转为超级用户&#xff0c;但是这样式不可行的&#xff0c;因为虚拟机会默认你第一次进入的用户是当前用户&#xff0c;还是解决不了问题。 解决办法&#xff1a; 再开一个连接进入…

java基于springboot_vue的校园闲置物品交易系统-计算机毕业设计

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 本文从管理员、用户的功能要求…

Java(八)----多线程(二)

1. 生产者与消费者 1.1 安全问题产生 线程本身就是一个新创建的方法栈内存 (CPU进来读取数据) 线程的notify(),唤醒第一个等待的线程 解决办法 : 全部唤醒 notifyAll() 被唤醒线程,已经进行过if判断,一旦醒来继续执行 线程被唤醒后,不能立刻就执行,再次判断标志位,利用循环 …

[附源码]Python计算机毕业设计Django基于Vue的社区拼购商城

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Python学习日记-第三十八天-生成器

系列文章目录 生成器创建生成器的方法生成器-使用send方式唤醒使用yield完成多任务一、生成器 利用迭代器&#xff0c;我们可以在每次迭代获取数据&#xff08;通过next方法&#xff09;时按照特定的规律进行生成&#xff0c;但是我们在实现一个迭代器时&#xff0c;关于当前…

Pr:导出设置之基本视频设置

视频 VIDEO设置因所选导出格式而异。每种格式都有独特的要求&#xff0c;这些要求决定了哪些设置可用。以导出文件格式为 H.264 为例&#xff0c;下面给出有关基本视频设置 Basic Video Settings的选项及说明。匹配源Match Souce自动设定视频设置选项以匹配源视频的属性。支持匹…

项目一共30个模块,你叫我maven版本一个个手动改?

之前有个群友私聊问我&#xff0c;如何快速统一去更改项目中所有的maven版本号&#xff0c;他说之前都是手动一个个去修改&#xff0c;项目一共有30多个maven模块&#xff0c;上次因为漏改了一个&#xff0c;还造成了生产事故。 其实我自己开源项目有的工程也非常多&#xff0…

Java入门必备知识你能掌握多少?

1、Java是一种高级计算机语言&#xff0c;是可以编写跨平台应用软件、完全面向对象的程序设计语言。 2、Java划分为三个技术平台&#xff1a;Java SE、Java EE、Java ME Java SE是桌面应用&#xff0c;Java EE是web应用&#xff0c;平台企业版&#xff0c;Java ME是手机应用&…

亚马逊鲲鹏系统批量注册功能可以让你快速拥有大量亚马逊买家号

亚马逊鲲鹏系统是一款能批量注册买家号、AI智能一键养号、模拟真人行为轨迹进行刷单测评的软件&#xff0c;而对于批量注册买家号&#xff0c;操作也是比较简单的。 主要流程是购买了相应的账号所需资料后&#xff0c;通过批量导入邮箱、邮箱密码、信用卡、收货地址进入软件然后…

嵌入式分享合集114

一、DMA DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道CPU有转移数据、计算、控制程序转移等很多功能&…

拿到8000元的火焰杯比赛奖金,感谢霍格沃兹测试开发学社

下面是我们获奖学员自己主动分享的 然后发给霍格沃兹测试开发学社表示感谢的&#xff0c;收到她的反馈我们也由衷的开心。所以也分享给大家&#xff0c;目前无论是应届生 在校生还是从业人员&#xff0c;都可以加入第三届火焰杯比赛&#xff0c;赢取属于专属于自己的荣耀。 我…

学生HTML个人网页作业作品:基于HTML实现教育培训机构网站模板毕业源码(8页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]JAVA毕业设计霍山石斛网站(系统+LW)

[附源码]JAVA毕业设计霍山石斛网站&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

AutoJs7打包薅羊毛时间版

AutoJs7打包薅羊毛时间版 一、准备工作&#xff1a; autojs7 app 下载地址&#xff1a;Auto.js Pro7.apk - 蓝奏云薅羊毛时间版 下载地址&#xff1a; 亚丁号---文件下载 安卓手机一部外加数据线&#xff08; Type-C或者USB&#xff09;&#xff0c;最好是安卓7的系统。电脑…

云服务器购买流程

云服务器购买流程 在技术学习的路上&#xff0c;除了虚拟机外最贴近实战的机器就是服务器。实际上在企业中有些小企业用的也是租赁的云服务器&#xff0c;有些是自己公司搭建的服务器。不管什么服务器了&#xff0c;实际上都是一样的&#xff0c;如果想更靠近企业级开发&#x…

Kotlin高仿微信-第52篇-搜索好友

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

HTTP

文章目录一、HTTP 基本概念GET 与 POSTHTTP 特性HTTP 与 HTTPSHTTP/1.1、HTTP/2、HTTP/3 演变HTTP/1.1如何优化如何避免发送 HTTP 请求&#xff1f;如何减少 HTTP 请求次数减少重定向请求次数合并请求延迟发送请求如何减少 HTTP 响应的数据⼤⼩&#xff1f;⽆损压缩有损压缩HTT…