数据结构算法

news2024/11/29 5:28:57

直接插入排序

1.从第一个元素开始,该元素可以认为已经被排序
2.取下一个元素tem,从已排序的元素序列从后往前扫描
3.如果该元素大于tem,则将该元素移到下一位
4.重复步骤3,直到找到已排序元素中小于等于tem的元素
5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置

例如:从数字5开始排序
在这里插入图片描述
时间复杂度:最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
      最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)

代码:

 public static void main(String[] args) {
        int[] arr = {5, 2, 8, 3, 1, 6};
        System.out.println("Before sorting: " + Arrays.toString(arr));
        insertionSort(arr);
        System.out.println("After sorting: " + Arrays.toString(arr));
    }
    public static void insertionSort(int[] arr) {
    int n = arr.length;
    for (int i = 1; i < n; ++i) {
        int key = arr[i];
        for(int j = i -1 ;j>=0;j--){
                //如果当前元素小于他前边的那个元素,当前这个元素目前所在位置放置他前一个元素
                if(key<arr[j]){
                    arr[j+1] = arr[j];
                    arr[j] = key;
                }else {
                    break;
                }
            }

    }
}

希尔排序

1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
在这里插入图片描述
时间复杂度平均:O(N^1.3)
空间复杂度:O(1)

代码:

  public static void main(String[] args) {
        int[] a = {1,2,5,4,3,9};
        ShellSort(a);
    }

    public static void ShellSort(int[] array)
    {
        int n = array.length;
        int inc;//希尔增量
        //这里采用朴素希尔增量,就是每次增量都是原来的一半,直到增量为1为止
        for (inc = n / 2; inc >= 1; inc = inc / 2)
        {//每一次循环都通过不断缩短增量达到排序的效果
            //在一次循环内,inc的值是固定的
            //下面的内容和插入排序的原理是一样的,只不过每个待排序元素的间隔是inc
            for (int i = inc; i < n; i++)
            {//i为什么是从inc开始,而不是从0开始?
                //因为插入排序中把排序元素分为两组,A组为已排好序的,B组为未排好序要插入的
                //A组开始时往往是第一个元素(0),那么B组的第一个元素就是整个待拍序列的第二个元素了(inc)
                int temp = array[i];//temp存储要插入的值
                int j;
                for (j = i-inc; j >= 0 && array[j] > temp; j = j - inc)
                {//j从i-inc开始往前遍历,每一步的距离是inc
                    array[j+inc] = array[j];//如果当前遍历到的元素(这里说的遍历到的元素是(array[j])比待插入元素temp小,
                        //这个元素往后移动一位,后边的元素被元素覆盖
                        //一旦不满足条件,1.说明要么遍历到元素比temp小,这个时候所有比temp大的元素都后移完了
                        //2.遍历到头了,此时第一个元素就是要插入的地方
                }
                array[j+inc] = temp;
                //那么此时array[j+inc]也就是要插入的地方,把temp插入进去
                System.out.println(Arrays.toString(array));
            }
        }
//        System.out.println(Arrays.toString(array));
    }

直接选择排序

每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。
实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。

  public static void main(String[] args) {

        int arrLength = 8;      //测试数组的长度
        /*
         * 获得随机arrLength个数的数组
         */
        int[] arr = new int[arrLength];
        for(int i = 0;i < arrLength;i++){
            //随机情况
            arr[i] = (int) (Math.random() * arrLength);
        }


        //排序前的输出
        for(int a:arr){
            System.out.print(a+" ");
        }
        System.out.println();


        choiceSort(arr);
        //排序后的输出
        for(int a:arr){
            System.out.print(a+" ");
        }

    }


    /**
     * 直接选择排序,每次选最小的放到最前
     */
    public static void choiceSort(int[] arr){

        if(arr == null || arr.length < 1){
            return;
        }

        int min = 0;
        int temp;
        /*只需要进行 n - 1 轮选择*/
        for(int i = 0;i<arr.length - 1;i++){
            min = i;                    //初始化当前最小的
            for(int j = i + 1;j<arr.length;j++){
                if(arr[min] > arr[j]){
                    min=j;                //记住最小元素下标
                }

            }

            //一轮后,当最小元素的下标不为i时交换位置
            if(min != i){
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
            System.out.println(Arrays.toString(arr));
        }




    }

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

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

相关文章

5.1劳动节,致敬最可爱的人!Cocos社区杰出贡献者出炉

Cocos 引擎的生态建设与繁荣&#xff0c;离不开社区开发者的辛勤付出。 2022.5 ~ 2023.5 年度期间&#xff0c;有这样一批 Cocos 社区开发者&#xff0c;他们使用 Cocos Creaor 引擎创作内容与产品、分享技术和经验&#xff0c;为 Cocos 社区默默贡献自己的一份力量&#xff0c…

改进YOLOv8:替换轻量化骨干网络Efficient V1、Efficient V2《重新思考卷积神经网络的模型缩放》)

这里写目录标题 1 EfficientNetV1中存在的问题2.EfficientNetV2网络框架3.YOLOv8添加Efficient V1代码yaml文件Efficient V1代码运行4. 添加Efficient V2代码yaml文件Efficient V2运行Efficient V1论文地址:https://arxiv.org/pdf/1905.11946.pdf Efficient V1代码地址:

Golang每日一练(leetDay0049) 二叉树专题(9)

目录 144. 二叉树的前序遍历 Binary-tree Preorder Traversal &#x1f31f; 145. 二叉树的前序遍历 Binary-tree Postorder Traversal &#x1f31f; 对比&#xff1a; 94. 二叉树的中序遍历 Binary-tree Inorder Traversal &#x1f31f; 146. LRU缓存 LRU Cache &am…

调用移动云OCR识别身份证

一.开通移动云OCR服务 在下面这个网址开通免费服务&#xff0c;&#xff0c;每个账号可免费使用500次&#xff0c;先要实名认证。 通用文字识别 (10086.cn)https://ecloud.10086.cn/home/product-introduction/Generalverify 有两种方式&#xff1a; 这里选择第二种 。 二…

炸裂的 Auto-GPT,帮我自动生成小视频!

大家好&#xff0c;我是程序员贺同学。 继前段时间爆火的 ChatGPT 后&#xff0c;又一个炸裂的开源项目 Auto-GPT 出现了。 仿佛一夜之间&#xff0c;AI 圈又出现了一个新晋顶流。我们来看看它有多&#x1f525;。 在 GitHub 上&#xff0c;仅最近不到两个礼拜&#xff0c;这个…

TCP/IP基础知识

文章目录 互联网与TCP/IP的关系TCP/IP与OSI参考模型硬件&#xff08;物理层&#xff09;互联网层&#xff08;网络层&#xff09;IPICMPARP 传输层TCPUDP 应用层WWW电子邮件&#xff08;E-Mail)文件传输&#xff08;FTP&#xff09;远程登录&#xff08;TELNET与SSH&#xff09…

Redis Set 用了 2 种数据结构来存储,到现在才知道

Sets 无序集合&#xff0c;他的功能就好像你熟悉的 Java 中的 HashSet 一样。集合是通过散列表实现的&#xff0c;所以添加、删除、查找元素的时间复杂度是 O(1)。 1. 是什么 Sets 是 String 类型的无序集合&#xff0c;集合中的元素是唯一的&#xff0c;集合中不会出现重复的数…

【百问百答】可靠性基础知识第三期

1.电连接器的基本性能有哪些? 三个基本性能&#xff1a;机械性能、电气性能和耐环境性能。 电连接器机械性能测试包括&#xff1a;插拔力测试、端子保持力测试、端子正向力测试、耐久性测试。 电气特性测试包括&#xff1a;绝缘电阻测试、 耐电压测试、 低电平电阻测试(LLCR…

【YOLO v1】模型搭建 | model | 代码

YOLO V1 模型 import torch import torch.nn as nn from torchsummary import summarydef build_block(in_channel, out_channel, kernel_size, stride1, maxpoolFalse):padding kernel_size//2block nn.Sequential(nn.Conv2d(in_channel, out_channel, kernel_sizekernel_si…

数据包守恒 TCP 拥塞控制

数据包守恒是包括拥塞控制在内的合理利用带宽的方法之基石&#xff0c;它维持了有效网络传输的稳定&#xff0c;过去 40 年是&#xff0c;未来还是。数据包守恒可以描述为&#xff1a; 当带宽恰好满载时&#xff0c;receiver 收到 1 个数据包后 sender 才能发送 1 个数据包。当…

LeetCode链表OJ题目 代码+思路分享

目录 删除有序数组中的重复项合并两个有序数组移除链表元素 删除有序数组中的重复项 链接: link 题目描述&#xff1a; 题目思路&#xff1a; 本题使用两个指针dst和src一前一后 相同情况&#xff1a; 如果nums[dst]nums[src]&#xff0c;那么src 不相同情况&#xff1a; 此…

基于B/S架构SpringBoot+Bootstrap框架的中小医院信息系统

一、开源项目简介 基于B/S架构&#xff0c;SpringBootBootstrap框架的中小医院信息系统。简单实现了挂号收费&#xff0c;门诊管理&#xff0c;划价收费&#xff0c;药房取药&#xff0c;体检管理&#xff0c;药房管理&#xff0c;系统维护等基础功能。 二、功能概述 本系统是…

计算机网络学习04(应用层常见协议总结)

1、HTTP:超文本传输协议 超文本传输协议&#xff08;HTTP&#xff0c;HyperText Transfer Protocol) 是一种用于传输超文本和多媒体内容的协议&#xff0c;主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候&#xff0c;我们网页就是通过 …

电脑硬盘检测怎么操作?如何检查硬盘的健康情况?

案例&#xff1a;如何对电脑硬盘进行检测&#xff1f; 【我的电脑硬盘中有许多重要的数据&#xff0c;我想知道电脑硬盘的健康状况怎么样&#xff1f;有没有小伙伴知道电脑硬盘检测的方法&#xff1f;】 电脑硬盘是存储数据的关键组件&#xff0c;而随着时间的推移和使用频率…

JAVA IO 模型详解

什么是IO I/O&#xff08;Input/Outpu&#xff09; 即输入&#xff0f;输出 。 从计算机结构的视角来看的话&#xff0c; I/O 描述了计算机系统与外部设备之间通信的过程。 从应用程序的视角来看的话&#xff0c;我们的应用程序对操作系统的内核发起 IO 调用&#xff08;系统调…

RocketMq windows 安装

RocketMq安装步骤&#xff1a; 1、直接在官网下载。也可以从这里自取 https://rocketmq.apache.org/download/ 2、修改bin目录下的文件 runserver.cmd 和 runbroker.cmd文件。主要修改所占用内存的大小。 runserver.cmd 修改如下&#xff1a; runbroker.cmd 修改如下&#xff…

数据结构与算法(三):树论(树形结构、二叉树、二叉搜索树、红黑树、BtreeB+Tree、赫夫曼树、堆树)

树论&#xff08;树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树&#xff09; 树形结构概念 在树形结构里面重要的术语&#xff1a; 结点&#xff1a;树里面的元素。 父子关系&#xff1a;结点之间相连的边 子树&#xff1a;当结点大于1时&#xff0…

牛客网CM11 链表分割

CM11 链表分割 描述示例解题思路以及代码解法1解法2 描述 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 示例 解题…

JDBC详解(四):操作BLOB类型字段(超详解)

JDBC详解&#xff08;四&#xff09;&#xff1a;操作BLOB类型字段 前言一、MySQL BLOB类型二、向数据表中插入大数据类型三、修改数据表中的Blob类型字段四、从数据表中读取大数据类型 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴…

倾斜摄影超大场景的三维模型轻量化与三维展示效果的关系浅析

倾斜摄影超大场景的三维模型轻量化与三维展示效果的关系浅析 倾斜摄影超大场景的三维模型由于数据量庞大&#xff0c;直接进行渲染可能会导致计算资源和时间的浪费。因此&#xff0c;针对倾斜摄影超大场景的三维模型区域进行轻量化处理是一种有效的优化手段。但是&#xff0c;轻…