排序算法Java_实现

1.引言

查找和排序算法是算法的入门知识,其经典思想可以用于比较常见。

1.1 内部排序和外部排序的区别

内部排序:待排序记录存放在计算机随机存储器中(内存)进行排序的过程。

外部排序:待排序记录的数量很大,以至于内存不能一次容纳全部记录,所以在排序过程中需要对外存进行访问的排序过程

1.2 内部排序算法的分类

在这里插入图片描述

1.3 内部排序算法复杂度

在这里插入图片描述

(一) 冒泡排序

冒泡排序,从下往上遍历,每次遍历往上固定一个最小值

添加一个标志位,当某次冒泡排序没有元素交换时,则冒泡结束,元素已经有序,可以有效减少冒泡次数。

  public class BubbleSort{
     public int [] bubbleSort(int []Arr,int n)
     {
          //以flag为标记,标记数组是否已经排序完成
           boolean flag = true;
           //固定左边的数字
           for(int i=0;i<n-1&flag;i++)
           {
              flag = false;
              //从后面(下面)往前(上)遍历
              for(int j=n-2;j>=i;j--)
              {
                 if(A[j]>A[j+1])
                 {
                    swap(A,j,j+1);
                    flag = true;
                 }
              }
           }
           return A;
     }
     //数组是按引用传递,在函数中改变数组起作用
     private void swap(int []A,int i,int j)
     {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
        
     }
  }

(二) 简单选择排序

初始升序:交换0次,时间复杂度为O(n);
初始降序:交换n-1次,时间复杂为O(n^2);
特点:交换移动数据次数少,比较次数多。

   import java.util.*;


    public class Selection{
         public int [] selectionSort(int [] A,int n){     
          //简短选择排序算法,排序结果为递增数组
          //记录最小下标值
          int min=0;
          //固定左边的数字
          for(int i=0;i<A.length-1;i++)
          {
             min=i;
             //找到下标i开始后面的最小值
             for(int j=i+1;j<A.length;j++)
             {
                if(A[min]>A[j])
                {
                  min=j;
                }
             }
             //确保稳定排序,数值相等就不用交换
             if(i!=min)
             {
               swap(A,i,min);
             }
          }
 
         }
         return A;
    }
  
  private void swap(int []A,int i,int j)
  {
       int temp = A[i];
       A[i]=A[j];
       A[j]=temp;
       
  }

(三)直接插入排序

   public class InsertionSort{
    
        public int[] insertionSort(int[] A,int n)
        {
          //用模拟插入扑克牌的思想
          //插入的扑克牌
          int i, j,temp;
          //已经插入一张,继续插入
          for(i=1;i<n;i++)
          {
            temp = A[i];
            //把i前面所有大于要插入的牌往后移一位,空出一位给新的牌
            for(j=i;j>0&&A[j-1]>temp;j--)
            {
             A[j]=A[j-1];
            }
            //把空出来的一位填满插入的牌
            A[j] = temp;
          }

            return A;
        }
   }
   

(四) 希尔排序

基本思想:算法先将要排序的一组数按某个增量d(n/2,为要排序数的个数)分成若干组,每组中记录的下标相差d,对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到一时,进行直接插入排序后,排序完成
希尔排序(缩小增量法)属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。

在这里插入图片描述

  import java.util.*;
  public class ShellSort{
    public int[] shellSort(int []A,int n)
    {
       //要插入的纸牌
       int temp,j,i;
       //设定增量D,增量D/2逐渐减小
       for(int D =n/2;D>=1;D=D/2)
       {
            //从下标d开始,对数组d进行插入排序
            for(j=D;j<n;j++)
            {  
               temp=A[j];
              for(i=j;i>=D&&A[i-D]>temp;i-=D)
               { 
                A[i]=A[i-D];
               }
            A[i] = temp;
           }
       }
        return A;
    }
  }

在这里插入图片描述

(五) 堆排序

【堆】 1、堆是完全二叉树 2、大顶堆:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆。3、小顶堆:每个节点的值都大于或等于其左右孩子节点的值,称为小顶堆。
【完全二叉树数组表示形式】:如果i>1,则双亲结点[i/2]。也就是说下标i与下标i2+1是双亲子女关系。
(注意如果排序对象为数组时,下标从0开始,所以下标i与下标2
1+1和2*i+2是双亲子女关系)

    import java.util.*;
    public class HeapSort{
        public  int[] heapSort(int[] A,int n)
        {
             //堆排序方法
              
               int i;
               //先把A[]数组构建成一个大顶堆。
               //从完全二叉树的最下层最右边的非终端点开始构建。
               for(i=n/2-1;i>=0;i--)
               {
                 HeapAdjust(A,i,n);
               }
       //开始遍历
       for(i=n-1;i>0;i--)
       {
         swap(A,0,i);
         //每交换一次得到一个最大值然后丢弃
         HeapAdjust(A,0,i);
       }
             return A;
        }
  //A[i] 代表的是下标为i的根节点
   private void HeapAdjust(int [] A,int i, int n)
   {
        //【注意】这里下标从0开始
         int temp;
         //存储根节点
         temp =A[i];
         //沿根节点的左右孩子中较大的往下遍历,由于完全二叉树特性i在左子节点2*i+1  i的右子节点 2*i+2
         for(int j=2*i+1;j<n;j=j*2+1)
         {
             if(j<n-1&&A[j]<A[j+1])
             {
                ++j;
             }
             if(temp>=A[j])
             {
                break;
             }
             //将子节点赋值给根节点
             A[i]=A[j];
             //将子节点下标赋给i
             i=j;
             
         }
         //将存储的根节点的值赋值给子节点
         A[i]=temp;
   }

private void swap(int []A,int i,int j)
{
   int temp = A[i];
   A[i]=A[j];
   A[j]=temp;
   
}


    }

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

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

相关文章

AI与区块链的融合:Web3时代下的新应用探索

本文来源香港Web3媒体Techub News AI与区块链&#xff1a;Web3时代的新机遇 在香港这座金融与科技交汇的繁荣都市&#xff0c;AI与区块链的结合已经成为Web3时代的重要议题&#xff0c;为行业发展带来了新的可能性和机遇。越来越多的开发者正在积极探索这一领域的融合&#xff…

复分析——第5章——整函数(复可积函数)(E.M. Stein R. Shakarchi)

第5章 整函数(复可积函数)(Entire Functions) ...but after the 15th of October I felt myself a free man, with such longing for mathematical work, that the last two months flew by quickly, and that only today I found the letter of the 19th of October that…

鸿蒙 Web组件的生命周期(api10、11、12)

概述 开发者可以使用Web组件加载本地或者在线网页。 Web组件提供了丰富的组件生命周期回调接口&#xff0c;通过这些回调接口&#xff0c;开发者可以感知Web组件的生命周期状态变化&#xff0c;进行相关的业务处理。 Web组件的状态主要包括&#xff1a;Controller绑定到Web组…

2024广东省职业技能大赛云计算赛项实战——Ansible部署Zabbix

Ansible部署Zabbix 前言 今年的比赛考了一道Ansible部署Zabbix的题目&#xff0c;要求就是用两台centos7.5的云主机&#xff0c;一台叫ansible&#xff0c;一台叫node&#xff0c;使用对应的软件包&#xff0c;通过ansible节点控制node节点安装zabbix服务。这道题还是算比较简…

计算机网络 —— 应用层(电子邮件)

计算机网络 —— 应用层&#xff08;电子邮件&#xff09; 电子邮件发送电子邮件的过程SMTP特性工作流程 电子邮件格式MIME关键组件工作方式 POP/IMAPPOP&#xff08;邮局协议&#xff09;IMAP&#xff08;因特网邮件访问协议&#xff09; 基于万维网的电子邮箱特点优势常见的基…

vscode c++ 开发环境配置

今天各位同学已经安装了mingw环境&#xff0c;但部分同学vscode开发环境又问题&#xff0c;究其原因&#xff0c;还是vscode 编译环境配置错误&#xff0c;有问题的同学 按如下步骤处理&#xff1a; 1、卸载相关插件。按下列步骤重新安装插件。 2、继续在搜索框中搜索并安装 C…

SpringSecurity6从入门到实战之登录后操作

SpringSecurity6从入门到实战之登录后操作 上次已经了解了如何进行自定义登录页面,这次主要是详细讲解登录成功,登录之后的跳转以及包括退出登录等一系列操作.让我们来看看SpringSecurity需要如何进行配置 登录之后的跳转 定义 Spring Security 配置类 Configuration EnableW…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

第一个Java程序

编写第一个Java程序通常从经典的"Hello,World!"程序开始。下面是一个简单的Java程序示例&#xff0c;它将打印出"Hello, World!"到控制台&#xff1a; 1.编写代码&#xff1a; 打开文本编辑器&#xff08;如记事本、Notepad、Visual StudioCode等&#x…

JavaSE 利用正则表达式进行本地和网络爬取数据(爬虫)

爬虫 正则表达式的作用 作用1&#xff1a;校验字符串是满足规则 作用2&#xff1a;在一段文本中查找满足需要的内容 本地爬虫和网络爬虫 Pattern类 表示正则表达式 Matter类 文本编译器&#xff0c;作用按照正则表达式的规则去读取字符串&#xff0c;从头开始读取&#xf…

永磁同步电机最大转矩电流比(MTPA)与弱磁(FW)算法以及模型设计

永磁同步电机数学模型如下&#xff1a; 上式中&#xff1a; vd为 d 轴电压&#xff08;V&#xff09;。 vq为 q 轴电压&#xff08;V&#xff09;。 id为 d 轴电流&#xff08;A&#xff09;。 iq为 q 轴电流&#xff08;A&#xff09;。 Rs为定子相绕组电阻&#xff08;Ω…

SM9加密算法:安全、高效的国产密码技术

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。加密算法作为保障信息安全的核心技术&#xff0c;受到了广泛关注。在我国&#xff0c;一种名为SM9的加密算法逐渐崭露头角&#xff0c;凭借其卓越的安全性能和高效计算能力&#xff0c;成为了新一代国产密码技术的代表…

【鸿蒙】HUAWEI DevEco Studio安装

HUAWEI DevEco Studio介绍 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE)&#xff0c; 助力高效开发。 DevEco Studio当前最新版本是&#xff1a; 3.1。 DevEco Studio计划里程碑 版本类型说明 下载 下载网址&#xff1a;DevEco Studio安装包官⽅下载 双击运行…

2024广东省职业技能大赛云计算赛项实战——编排部署ERP管理系统

编排部署ERP管理系统 前言 编写docker-compose.yaml文件&#xff0c;要求使用镜像mysql、redis、nginx和erp完成ERP管理系统的编排部署。 编写docker-compose.yaml完成ERP管理系统的部署&#xff0c;要求定义mysql、redis、nginx和erp共四个Service&#xff0c;分别使用镜像e…

前端 CSS 经典:flex + margin 布局

前言&#xff1a;如今我们布局大多时候都是用的 flex 布局&#xff0c;但是有时我们也可以使用 margin 小技巧去完成布局。在弹性盒中当我们把 margin 某一个方向上设置为 auto&#xff0c;他的含义是用 margin 吃掉这个方向的剩余空间。 1. 元素垂直和水平居中 <!DOCTYPE…

微软TTS最新模型,发布9种更真实的AI语音

很高兴与大家分享 Azure AI 语音翻译产品套件的两个重大更新&#xff1a; 视频翻译和增强的实时语音翻译 API。 视频翻译&#xff08;批量&#xff09; 今天&#xff0c;我们宣布推出视频翻译预览版&#xff0c;这是一项突破性的服务&#xff0c;旨在改变企业本地化视频内容…

《车载以太网通信测试》课程来袭!!!

本课程包含教程和脚本两部分内容。 教程 详细介绍以太网&#xff0c;如何理解TCP/IP协议&#xff0c;CAPL中涉及以太网的代码&#xff0c;以太网测试环境如何搭建&#xff0c;从物理层、链路层、网络层、传输层到应用层多种协议测试点的测试原理和测试方法介绍&#xff0c;中…

基于微信共享充电桩小程序毕业设计作品成品(3)开发技术文档_充电桩小程序前端技术栈

后台管理系统文件 所在路径&#xff1a;后台源码ht目录是后台 绿色显示的是系统框架&#xff0c;不要动 位置程序名说明源码根目录login.php后台登录页面源码根目录check_u_login.php后台登录处理程序ht 后台根目录index.php后台首页left.php后台左侧菜单u_logout.php退出登…

LeetCode 算法:K 个一组翻转链表 c++

原题链接&#x1f517;&#xff1a;K 个一组翻转链表 难度&#xff1a;困难⭐️⭐️⭐️ 题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k …

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验5 交换机的自学习算法

一、实验目的 1.验证交换机的自学习算法&#xff1b; 2.了解交换机对帧的过滤特性&#xff1b; 3.学习交换机如何登记接收到的数据包&#xff1b; 4.学习交换机如何转发数据包&#xff08;明确转发&#xff0c;盲目转发&#xff0c;丢弃&#xff09;。 二、实验要求 1.使用Cisc…