排序算法Java_实现

news2024/11/28 0:40:39

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


    }

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

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

相关文章

MyBatisplus使用报错--Invalid bound statement

报错如下 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.lotus.mybatis.mapper.UserMapper.selectListat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)at com.baomidou.mybatisplus.cor…

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

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

onlyoffice报错:这份文件无法保存。请检查连接设置或联系您的管理员当你点击

文章目录 一、onlyoffice报错&#xff1a;这份文件无法保存。请检查连接设置或联系您的管理员当你点击二、解决方法总结 一、onlyoffice报错&#xff1a;这份文件无法保存。请检查连接设置或联系您的管理员当你点击 二、解决方法 禁用防火墙 sudo ufw disable总结 作者&…

MySQL 面试突击指南:核心知识点解析1

MySQL中有哪些存储引擎? InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎,设计用于处理大量短期事务。 MyISAM存储引擎 在MySQL 5.1及之前版本,MyISAM是默认的存储引擎。它提供了全文索引、压缩、空间函数(GIS)等特性,但不支持事务和…

Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

shell命令 ls -al 实现 #include <43func.h> void error_check(int ret, const char *msg) {if (ret -1) {perror(msg);exit(EXIT_FAILURE);} }char get_file_type(mode_t mode) {if (S_ISREG(mode)) return -;//检查给定的文件模式&#xff08;通常是从 stat 或 lst…

36.6K star!Immich - 一款开源高性能的自托管照片和视频备份方案

大家好&#xff0c;今天给大家分享的是一个高性能的自托管照片和视频备份方案。 Immich 是一个图片管理和分享平台&#xff0c;它允许用户高效地组织、存储和访问他们的照片和视频集合。这个项目特别设计来优化个人和家庭的多媒体内容管理体验&#xff0c;提供了诸如自动备份、…

贾英才主任受聘担任“两个中心”专家委员会委员

近日&#xff0c;第二届海峡两岸中西医结合肾脏病学术大会授牌仪式在北京隆重举行。 这一盛会吸引了众多医学领域的专家学者&#xff0c;共同探讨中西医结合治疗肾脏病的最新进展和未来发展方向。 在此次大会上&#xff0c;崇文门中医医院的贾英才主任凭借其在肾脏病领域的卓…

绝地求生PUBG联名补偿奖励来了 补偿奖励介绍详情解析

绝地求生》(PUBG) 作为一款战术竞技型射击类沙盒游戏&#xff0c;从上线以来就深受玩家小伙伴们的喜爱&#xff0c;即便是没有玩过的小伙伴&#xff0c;对“吃 鸡”二字想必也是很耳熟的&#xff0c;这正是《绝地求生》(PUBG) 的别称。 在北京时间6月12日&#xff0c;由于绝地求…

挑战从不是终点,而是人生的起点

对于交易员来说&#xff0c;每一次市场的起伏都是对内心坚韧与技能精进的考验。无论遭遇的是挫败还是辉煌&#xff0c;它们都是通向卓越道路上不可或缺的磨砺。正是在这些磨难与历练中&#xff0c;我们不断重塑自我&#xff0c;锤炼技术&#xff0c;直至面对看似难以逾越的障碍…

行业唯一!三翼鸟场景品牌战略推动价值凸显

文 | 智能相对论 作者 | 佘凯文 当你的一只羊跑进别人的羊群中&#xff0c;怎么才能找到它&#xff1f; 从前人们为了区分自己的财产&#xff0c;会用烧红的铁块印在动物身上作为标记。在中世纪的欧洲&#xff0c;手工艺匠人用这种烧灼的方法在自己的手工艺品上烙下标记&…

会声会影2024 视频编辑创作利器 #AI智能剪辑 #特效资源库 #共创共享 #视频创作爱好者

&#x1f31f;【全新升级&#xff01;会声会影2024&#xff0c;视频编辑的革新之作】&#x1f31f; 嗨&#xff0c;CSDN的朋友们&#xff0c;今天要跟大家分享一款让我彻底震撼的视频编辑软件——会声会影2024最新版本&#x1f3ac;&#xff01;作为一位热爱创作的内容创作者&a…

昇思25天学习打卡营第3天|数据集 Dataset|数据变换 Transforms

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 数据集 Dataset 数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&am…

chatgpt: linux 下用纯c 编写一按钮,当按钮按下在一新窗口显示hello world

用这个程序模板&#xff0c;就可以告别只能在黑框框的终端中编程了。 在 Linux 环境下使用纯 C 语言编写一个按钮&#xff0c;当按钮按下时&#xff0c;在一个新窗口显示 "Hello World"。我们可以使用 GTK 库来实现这个功能。GTK 是一个用于创建图形用户界面的跨平台…

论文辅导 | 基于K-means聚类和ELM神经网络的养殖水质溶解氧预测

辅导文章 模型描述 1&#xff09;相似度统计量构造。数据归一化后&#xff0c;利用皮尔森相关系数确定环境因子权重&#xff0c;构造相似日的统计量&#xff0d;相似度。 2&#xff09;K-means 聚类。根据相似度应用 K-means 聚类法对历史日数据样本聚类&#xff0c;找出合适样…

clean code-代码整洁之道 阅读笔记(第十一章)

第十一章 系统 “复杂要人命,它消磨开发者的生命&#xff0c;让产品难以规划、构建和测试。” --RayOzzie&#xff0c;微软公司首席技术官 11.1 如何建造一个城市 每个城市都有一组组人管理不同的部分&#xff0c;有些人负责全局&#xff0c;其他人负责细节。 城市能运转&#…

昨天发的 npm 包,却因为 registry 同步问题无法安装使用

用过 HBuilderX 云打包的都知道&#xff0c;云上面的 Android 环境很有限&#xff0c;其实并不能覆盖 uniapp 生态所有的版本&#xff0c;甚至说只能覆盖最新的一两个版本。 如果你需要用到 HBuilderX 安卓云打包&#xff0c;就必须及时跟进 HBuilderX 的版本更新&#xff0c;…

【人机交互 复习】第7章 可视化设计

一、窗口界面类型 1.多文档界面 &#xff08;1&#xff09;优点 a.节省系统资源 b.最小的可视集 c.协同工作区 d.多文档同时可视化 &#xff08;2&#xff09;缺点 a.菜单随活动文档窗口状态变化&#xff0c;导致不一致性 b.文档窗口必须在主窗口内部&#xff0c;减弱多文档显…

[C++][数据结构][B-树][上]详细讲解

目录 0.常见的搜索结构1.B树概念2.B-树的插入分析1.流程分析2.插入过程总结 0.常见的搜索结构 种类数据格式时间复杂度顺序查找无要求 O ( N ) O(N) O(N)二分查找有序 O ( l o g 2 N ) O(log_2 N) O(log2​N)二叉搜索树无要求 O ( N ) O(N) O(N)二叉平衡树无要求 O ( l o g 2 …

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

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

自动化办公04 使用pyecharts制图

目录 一、柱状图 二、折线图 三、饼图 四、地图 1. 中国地图 2. 世界地图 3. 省会地图 五、词云 Pyecharts是一个用于数据可视化的Python库。它基于Echarts库&#xff0c;可以通过Python代码生成各种类型的图表&#xff0c;如折线图、柱状图、饼图、散点图等。 Pyecha…