首页 > 编程语言 >【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析

【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析

时间:2024-12-22 13:55:42浏览次数:5  
标签:arr Java int 唐叔学 复杂度 heapify largest 排序

引言

在数据排序的世界里,选择排序是一类简单而直观的算法,它通过不断选取未排序部分中的最小(或最大)元素来逐步构建有序序列。今天,我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序,并提供它们的Java实现代码。此外,我们还会分析这两种排序算法的时间复杂度和空间复杂度,帮助你理解其背后的运作机制。

直接选择排序(Selection Sort)
算法描述

直接选择排序是一种最基础的选择排序形式。它的基本思想是每次从未排序的元素中选出最小的一个元素,然后将其与未排序部分的第一个元素交换位置。如此反复,直到所有元素都被排好序为止。

时间复杂度
  • 最佳、平均和最差情况均为 O(n²),其中 n 是待排序数组的长度。
空间复杂度
  • 因为只需要常数级别的额外空间,所以空间复杂度为 O(1)。
Java实现
public class SelectionSort {
    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            // 交换找到的最小元素和当前元素
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }

    public static void main(String[] args) {
        int[] data = {64, 25, 12, 22, 11};
        sort(data);
        System.out.println("Sorted array: " + Arrays.toString(data));
    }
}
堆排序(Heap Sort)
算法描述

堆排序利用了二叉堆的数据结构特性。首先将待排序的数组构建成一个大根堆(对于升序排列),接着依次取出堆顶的最大元素放到数组末尾,再调整剩余元素重新构成大根堆,重复此过程直至所有元素都被排序。

时间复杂度
  • 构建堆的时间复杂度为 O(n),而每一次调整堆的操作时间复杂度为 O(log n),因此总的时间复杂度为 O(n log n)。
空间复杂度
  • 和直接选择排序一样,堆排序的空间复杂度也是 O(1),因为它是在原地进行排序。
Java实现
public class HeapSort {
    public static void sort(int[] arr) {
        int n = arr.length;

        // 构建大根堆
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);

        // 一个个从堆中提取元素
        for (int i = n - 1; i >= 0; i--) {
            // 移动当前根到末尾
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // 调用heapify函数在减少的堆上
            heapify(arr, i, 0);
        }
    }

    // 对大小为n的以i为根节点的堆进行heapify操作
    private static void heapify(int[] arr, int n, int i) {
        int largest = i; // 初始化最大的为根
        int left = 2 * i + 1; // 左子节点
        int right = 2 * i + 2; // 右子节点

        // 如果左子节点大于根
        if (left < n && arr[left] > arr[largest])
            largest = left;

        // 如果右子节点大于最大的
        if (right < n && arr[right] > arr[largest])
            largest = right;

        // 如果最大的不是根
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;

            // 递归地heapify受影响的子树
            heapify(arr, n, largest);
        }
    }

    public static void main(String[] args) {
        int[] data = {12, 11, 13, 5, 6, 7};
        sort(data);
        System.out.println("Sorted array is: " + Arrays.toString(data));
    }
}
结语

通过上述讲解,我们可以看出直接选择排序和堆排序虽然都属于选择排序,但它们有着显著的不同之处。前者更易于理解和实现,但在处理大数据量时效率较低;后者则具有更好的性能表现,特别是在需要频繁访问最大或最小值的应用场景下。希望这篇文章能为你揭开选择排序的神秘面纱,并为你的编程之旅增添一份力量。

标签:arr,Java,int,唐叔学,复杂度,heapify,largest,排序
From: https://blog.csdn.net/Tang_is_learning/article/details/144645799

相关文章

  • 6. Java自动装箱与拆箱
    1.装箱就是自动将基本数据类型转换为包装器类型(int->Integer);调用方法:Integer.valueOf(int)方法2.拆箱就是自动将包装器类型转换为基本数据类型(Integer->int);调用方法:Integer.intValue()方法在JavaSE5之前,如果要生成一个数值为10的Integer对象,必须这样执行:Integeri=newInteger......
  • 【Java项目】基于SpringBoot+Vue的租房网站
    源码获取:https://download.csdn.net/download/u011832806/89432125基于SpringBoot+Vue的租房网站开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven租房网站通过对用户的需求进行分析,结合实际情况进行开发研究,对用户的所有需求做......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(车之家)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • lambda排序小记
    一、按照几个字段分别排序:Student:packagecom.model;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.Setter;importlombok.ToString;@Getter@Setter@ToString@AllArgsConstructorpublicclassStudent{privateStringname;priv......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(团购)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 78.一维数组和二维数组的排序实现
    因为碰到了一些题目故此来做总结一维数组最常用的冒泡排序:#include<stdio.h>voidsort(intarr[],intn){//外层循环for(inti=0;i<n-1;++i){intflag=1;//假设flag=1就是已经排序好的//内层循环for(intj=0;j<n-1-i;......
  • 基于Java的动态交通信息服务系统设计与实现
    计算机毕业设计案例Java毕业设计案例ASP.NET毕业设计案例PHP毕业设计案例微信小程序毕业设计案例基于Java的村镇社区数据管理系统基于ASPNETMVC的网站式音乐播放基于php的微信小程序在线考试系统基于Java的“free美妆榜”微信小程序【12/19/02】基于Java后台的口罩查询......
  • 医药垃圾分类管理系统|Java|SSM|JSP|
                           【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务......
  • 网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apacheto......
  • 【Java毕业设计】基于SpringBoot+Vue的准妈妈孕期交流平台
    源码获取:https://download.csdn.net/download/u011832806/89432114基于SpringBoot+Vue的准妈妈孕期交流平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/14-h8FUqS2qXkskoAboV-Qg?......