首页 > 编程语言 >Java常见排序算法详解:快速排序、插入排序与冒泡排序

Java常见排序算法详解:快速排序、插入排序与冒泡排序

时间:2024-11-14 20:16:37浏览次数:3  
标签:arr Java int 复杂度 元素 冒泡排序 排序

在程序设计中,排序是最基本的操作之一。Java提供了多种排序算法,今天我们将介绍三种常见的排序方法:快速排序插入排序冒泡排序。我们不仅会分析它们的基本原理,还会提供实际的代码实现,帮助大家更好地理解并应用这些排序算法。

一、快速排序(Quick Sort)

快速排序是一种分治法的排序算法,其基本思想是选择一个"基准"元素,将数组分成两部分,一部分的元素都小于基准元素,另一部分的元素都大于基准元素。然后递归地对这两部分分别进行排序。由于分治法的高效性,快速排序通常在很多实际应用中表现出色。

快速排序实现

public class Arrar02 {
    public static void main(String[] args) {
        int[] arr = new int[]{42,53,72,93,15,72};
        //快速排序
        quickSort(arr, 0, arr.length - 1);
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }

    private static void quickSort(int[] arr, int left, int right) {
        int i,j,temp,t;
        if(left>=right)
            return;
         temp=arr[left];
        i=left;
        j=right;
        while (i<j){
            while (i<j&&temp <= arr[j]) {
                j--;
            }
            while (i<j&&temp>=arr[i])
            {
                i++;
            }

            if(i<j){
                t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
        arr[left]=arr[i];
        arr[i]=temp;
        quickSort(arr, left,i-1);
        quickSort(arr,i+1,right);
    }
}

  结果展示:

15 42 53 72 72 93 

快速排序解析

  • 基准选择:通常,我们选择数组的第一个元素作为基准,但也可以选择其他位置的元素(例如随机选择)。
  • 分治法:通过一个循环,将数组分成两部分,使得左边部分的所有元素都比基准元素小,右边部分的所有元素都比基准元素大。
  • 递归排序:递归地对两部分数组进行排序,直到每部分数组的元素都已经有序。

时间复杂度

  • 最优时间复杂度:O(n log n)
  • 最差时间复杂度:O(n²),发生在数组已经接近有序时(例如,始终选择数组的第一个元素作为基准)。

二、插入排序(Insertion Sort)

插入排序是一种简单的排序算法,它通过将一个元素插入到已经排好序的部分,直到所有元素都有序。对于数据量较小的数组,插入排序的效率较高。

插入排序实现

public class TestBubbleSort {
    public static void main(String[] args) {

        int[] arr = {450, 34, 25, 73, 83, 16};
        insertSort(arr);
    }
 private static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            int j = i - 1;
            while (j >= 0 && arr[j] > temp) {
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = temp;
        }
        for (int ele : arr
        ) {
            System.out.print(ele + "\t");
        }

    }
}

 结果展示: 

16	25	34	73	83	450

插入排序解析

  • 插入操作:从第二个元素开始,依次将每个元素与前面的元素进行比较,找到其合适的位置并插入。
  • 时间复杂度:最坏情况下(数组逆序),时间复杂度为O(n²),但对于接近有序的数组,插入排序非常高效,时间复杂度接近O(n)。

时间复杂度

  • 最优时间复杂度:O(n)(当数组已经排好序时)
  • 最差时间复杂度:O(n²)

三、冒泡排序(Bubble Sort)

冒泡排序是一种简单的交换排序算法,其基本思想是通过不断交换相邻元素的顺序,逐步将最大(或最小)的元素“冒泡”到数组的一端。虽然冒泡排序的实现简单,但它并不是非常高效。

冒泡排序实现

public class TestBubbleSort {
    public static void main(String[] args) {

        int[] arr = {450, 34, 25, 73, 83, 16};
        bubbleSort(arr);
    }
//冒泡排序
    private static void bubbleSort(int[] arr) {
        int temp = 0;
        //比较arr.length-1轮
        for (int i = 0; i < arr.length - 1; i++) {
            //每轮比较arr.length-1-i次
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }

        }
        for (int ele : arr
        ) {
            System.out.print(ele + "\t");
        }
    }
}

 结果展示:

16	25	34	73	83	450

冒泡排序解析

  • 交换过程:每一轮比较相邻元素,如果它们的顺序错误就交换它们的位置。每一轮循环结束后,最大的元素会“冒泡”到数组的末端。
  • 优化:冒泡排序的一个常见优化是,如果在某一轮比较中没有发生任何交换,说明数组已经有序,可以提前退出循环。

时间复杂度

  • 最优时间复杂度:O(n)(当数组已经排好序时)
  • 最差时间复杂度:O(n²)

四、总结

我们介绍了三种常见的排序算法:快速排序、插入排序和冒泡排序。每种算法都有其特点和适用场景:

  1. 快速排序:适用于大规模数据的排序,平均时间复杂度为O(n log n),性能较优。
  2. 插入排序:适用于数据量较小或接近有序的情况,简单易懂,但在大规模数据时效率较低。
  3. 冒泡排序:简单易实现,但性能较差,特别是对于大量数据时,时间复杂度为O(n²)。

理解这些排序算法对于编写高效的程序非常重要,尤其在处理大量数据时,选择合适的排序算法能够显著提高性能。在实际应用中,我们常常会根据数据的特点选择合适的排序方法。

标签:arr,Java,int,复杂度,元素,冒泡排序,排序
From: https://blog.csdn.net/2402_85834817/article/details/143779615

相关文章

  • java 反序列化 cc3 复现
    版本要求:jdk版本<=8u65,common-collections版本<=3.2.1在很多时候,Runtime会被黑名单禁用.在这些情况下,我们需要去构造自定义的类加载器来加载自定义的字节码.类加载机制双亲委派这里直接粘别人的了.实现一个自定义类加载器需要继承ClassLoader,同时覆盖findClass方法......
  • java 反序列化 cc4 复现
    复现环境:jdk<=8u65,commonsCollections=4.0CommonsCollections4.x版本移除了InvokerTransformer类不再继承Serializable,导致无法序列化.但是提供了TransformingComparator为CommonsCollections3.x所没有的,又带来了新的反序列化危险.cc4的执行命令部分依然沿用cc3的TemplatesI......
  • 快速排序和归并排序的比较
    基本原理比较快速排序:基于分治策略。它选择一个基准元素(pivot),通过一趟排序将待排序序列分割成两部分,其中左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素。然后对这两部分分别进行快速排序,递归地重复这个过程,直到整个序列有序。例如,对于序列[4,7,......
  • [原创]手把手教学之前端0基础到就业——day11( Javascript )
    文章目录day11(Javascript)01Javascript①Javascript是什么②JavaScript组成③Javascript的书写位置1.行内式(不推荐)2.内部位置使用(内嵌式)3.外部位置使用(外链式)02变量1.什么是变量2.定义变量及赋值3.注意事项4.命名规范03输入和输出1)输出形式1......
  • java API
     API(ApplicationProgrammingInterface)是指应用程序的编程接口。字符串类Java中定义了3个封装字符串的类,分别是String类、StringBuffer类、StringBuilder类,它们位于Java.lang包中,并提供了一系列操作字符串的方法,这些方法不需要导包就可以直接使用。1.1String的初始化......
  • python+vue基于django/flask新农村综合风貌展示平台java+nodejs+php-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • java的算法-余弦相似度
    背景:做过财务系统的小伙伴们都知道,财务系统会有一个自动计费的算法,这个算法依赖于计费模板,之前的同事呢把计费公式乱写(导致很多重复的公式),虽然计费名称不一样但是计费公式却是一样的,今天就写一个算法来计算公式代码之间的相似度publicstaticvoidmain(String[]args){......
  • java学习记录06
    正则表达式匹配规则对于正则表达式来说,它只能精确匹配字符串。例如:正则表达式“abc",只能匹配”abc",不能匹配“ab","Abc","abcd"等其他字符串。如果想匹配非ASCII字符,例如中文,那么就用\u####的十六进制表示,例如:a\u548cc匹配的是字符串"a和c",中文字符和的Unicode编码是548c......
  • java学习记录05
    Object类通用方法Object类是所有类的超类。如果在类声明中没有使用extends关键字明确指定超类,那么默认的超类就是Object类。这就意味着所有的对象(包括数组)都实现了该类的方法。Object的所有方法native表示这个方法的实现是由其他语言(例如C或C++)编写的,它并不在Java源代码中......
  • 排序
    堆排序什么是堆?从存储视角来看就是数组,逻辑视角上看是一个顺序存储的"完全二叉树",大根堆是根>=左右孩子结点,小根堆是根<=左右孩子结点。什么是堆排序?如何建堆?如何基于堆排序?堆排序算法效率分析时间复杂度排序的时间开销花费主要是两方面,一是比较二是交换,堆排序的时......