首页 > 编程语言 >java排序算法2(简单选择排序、堆排序)

java排序算法2(简单选择排序、堆排序)

时间:2023-04-24 21:34:03浏览次数:45  
标签:arr java int max 复杂度 堆排序 排序 节点

简单选择排序---不稳定

选择排序在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后以此类推,直到所有元素均排序完毕。

        for (int i = 0; i < arr.length; i++) {
            //记录最小值下标位置
            int min=i;
            for (int j=i+1;j<arr.length;j++){
                if (arr[i]>arr[j]){
                    min=j;
                }
            }
            //交换位置
            if (min != i) {
                int tmp=arr[i];
                arr[i]=arr[min];
                arr[min]=tmp;//如果有两个相同的值,2,2,1,这种情况,第一次排序时,第一个2到了1的位置,所以排序不稳定
            }
        }
平均时间复杂度 最坏 最好 空间复杂度
O(n²) O(n²) O(n²) O(1)

堆排序---不稳定

预备知识

image

1.父结点索引:(i-1)/2(这里计算机中的除以2,省略掉小数)
2.左孩子索引:2i+1
3.右孩子索引:2
i+2
升序用大顶堆,降序用小顶堆。

	//维护堆,参数为数组和当前需要维护的根节点,len表示堆中有多少元素
    public void heapify(int[] arr,int len, int i) {
        // 最大值节点
        int max = i;
        int lChild = i * 2 + 1;
        int rChild = i * 2 + 2;
        //找出孩子节点中最大的那个值,然后交换
        if (lChild < len && arr[lChild] > arr[max]) {
            max=lChild;
        }
        if (rChild < len && arr[rChild] > arr[max]) {
            max=rChild;
        }
        //交换节点位置
        if (max != i) {
            swep(arr,i,max);
            //递归维护之后的节点
            heapify(arr,len,max);
        }
    }
    //交换节点
    public void swep(int[] arr,int i,int j){
        int tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
    }

    //堆排序
    public void heapSort(int[] arr) {
        //建堆,i表示最后一个非叶子节点
        for (int i = arr.length/2-1; i >=0; i--) {
            heapify(arr,arr.length,i);
        }
        //排序,将堆顶元素和最后一个元素交换,然后将最后一个元素移除堆,维护堆,再将倒数第二个元素和堆顶元素交换......
        for (int j = arr.length - 1; j >0 ; j--) {
            swep(arr,j,0);
            //最后一个元素不需要参与维护,所以长度是arr.length-1,一次减少一次
            heapify(arr,j,0);
        }
    }

1.建立堆的过程, 从length/2 一直处理到0, 时间复杂度为O(n);
2.调整堆的过程是沿着堆的父子节点进行调整, 执行次数为堆的深度, 时间复杂度为O(lgn);
3.堆排序的过程由n次第2步完成, 时间复杂度为O(nlgn).

平均时间复杂度 最坏 最好 空间复杂度
O(nlog2n) O(nlog2n) O(nlog2n) O(1)

标签:arr,java,int,max,复杂度,堆排序,排序,节点
From: https://www.cnblogs.com/yliunyue/p/17350974.html

相关文章

  • Java基础知识点API之Objects
    一:Objects的概述它是一个对象工具类,提供一些操作对象的方法。二:Objects的成员方法方法名说明publicstaticbooleanequals(Objecta,Objectb)先做非空判断,比较两对象publicstaticbooleanisNull(Objectobj)判断对象是否为null,为null返回true,否则返回falsepublicstaticboolea......
  • 基础巩固、探寻Java装箱和拆箱的奥妙!
    前言  今天在逛某知名论坛的时候,看到一篇"请不要使用包装类型,避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是,能用基本数据类型就尽量用基本数据类型,因为包装类型自动拆箱、装箱会带来性能损失尤其是循环使用时会大量创建对象。所以今天聊一下,Java的装箱和拆箱。......
  • drf-认证、权限、频率、过滤、排序、分页
    1.认证组件1.1局部认证1.首先写两个接口,一个查询单个一个查询所有,我们利用视图扩展类和视图子类写在一个视图类上:views.py:fromrest_framework.viewsetsimportViewSetMixinfromrest_framework.genericsimportListAPIViewfromrest_framework.mixinsimportRetrieve......
  • java反序列化(五) JNDI注入
    JNDI注入前置知识JNDIJNDI(JavaNamingandDirectoryInterface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。可以通过字符串来锁定一个对象JNDI支持的服务主要有以下几种:RMI(JAVA远程方法调用)LDAP(轻量级目录访问协......
  • Java-基础篇【数组、方法、面向对象基础.】
    1:数组引用类型,不是基本数据类型2:静态初始化数组111 ......
  • Java中缓存区的基本使用
    前言缓存区是一种内存空间,在计算机程序中被广泛使用来优化I/O操作的效率。在文件I/O操作中,缓存区用于缓存将要写入磁盘或读取到内存中的数据。这样可减少对磁盘的访问次数,提高I/O操作的效率。本文将介绍缓存区的基本使用以及一些注意点,并提供一个实例来演示如何将一个jpg图片复制......
  • java执行linux语句
    publicclassCommandUtil{/***在指定路径下执行一条命令,不能执行cd之类的命令**@paramcommand要执行的Linux命令*@paramdir目标路径,在该路径执行上述Linux命令*@return命令执行后显示的结果*@throwsIOException*/......
  • Java中Runnable和Callable的区别 Runnable接口
    Callable接口从Java1.0开始,它是java.lang包的一部分从Java1.5开始,它是java.util.concurrent包的一部分。Runnable接口不能返回计算的结果。Callable接口可以返回一个任务的并行处理的结果。Runnable接口不能抛出一个有检查的异常。Callable接口可以抛出一个有检查的异常。......
  • java反序列化(五) JNDI注入
    JNDI注入前置知识JNDIJNDI(JavaNamingandDirectoryInterface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。可以通过字符串来锁定一个对象JNDI支持的服务主要有以下几种:RMI(JAVA远程方法调用)LDAP(轻量级目录访问协......
  • Java中null和“”的区别
    null和空字符串('')虽然都是没有任何内容,但是null却输出空指针异常,因为堆内存中根本就没有这个东西。他们的区别可相当大,虽然都是没有信息,但是null代表堆内存中根本没有这个东西,这个对象不存在,怎么执行indexof操作?空字符串虽然没有信息,但是是有内存空间的,所以null与空字符串主要......