Java 常见排序算法代码分享

Java 常见排序算法代码分享

本文将分享 Java 中常见的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序,并提供相关算法的代码示例和分析。

冒泡排序

冒泡排序是一种简单的排序算法。下面是它的基本操作:

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个。
  2. 对第0个到第n-1个数据进行一次遍历,遍历过程中,不断交换相邻逆序的元素,最终实现的一次遍历是把最大的元素移到了数组的末尾。
  3. 对前n-1个元素重复上述步骤,直到整个数组按照从小到大的顺序排列。

冒泡排序的时间复杂度为O(n^2)。

以下是冒泡排序的Java代码示例:

public static void bubbleSort(int[] arr){
    int len = arr.length;
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

选择排序

选择排序的基本思想是:首先在未排序的数列中找到最小元素,然后将其存放到数列的起始位置,接着,再从剩余未排序的元素中继续寻找最小的元素,然后放到已排序序列的末尾,直到所有元素均排序完毕。

选择排序的时间复杂度为O(n^2)。

以下是选择排序的Java代码示例:

public static void selectionSort(int[] arr){
    int len = arr.length;
    for (int i = 0; i < len - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

插入排序

插入排序是一种简单的排序算法。基本思想是:将待排序的数据分成两部分,前一部分包含有序的数据,后一部分为无序的数据,从后往前扫描未排序的数据,每次插入一个数,使得前面有序序列仍然有序。

插入排序的时间复杂度为O(n^2)。

以下是插入排序的Java代码示例:

public static void insertionSort(int[] arr){
    int len = arr.length;
    for (int i = 1; i < len; i++) {
        int j = i - 1;
        int temp = arr[i];
        while (j >= 0 && arr[j] > temp) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = temp;
    }
}

希尔排序

希尔排序是插入排序的一种高效率的改进版本,基本思想是分组插入排序,通过设定合适的步长缩小插入排序的范围,达到了优化插入排序的目的。

希尔排序的时间复杂度为O(n(logn)^2)。

以下是希尔排序的Java代码示例:

public static void shellSort(int[] arr){
    int len = arr.length;
    int gap = len / 2;
    while (gap > 0) {
        for (int i = gap; i < len; i++) {
            int j = i;
            int temp = arr[j];
            while (j - gap >= 0 && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j = j - gap;
            }
            arr[j] = temp;
        }
        gap = gap / 2;
    }
}

归并排序

归并排序使用分治策略,将待排序序列分为若干个子序列,对每个子序列进行排序,然后合并成一个有序序列,实现整体有序。

归并排序的时间复杂度为O(nlogn)。

以下是归并排序的Java代码示例:

public static void mergeSort(int[] arr, int left, int right){
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

public static void merge(int[] arr, int left, int mid, int right){
    int[] temp = new int[right - left + 1];
    int i = left;
    int j = mid + 1;
    int k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k] = arr[i];
            k++;
            i++;
        } else {
            temp[k] = arr[j];
            k++;
            j++;
        }
    }
    while (i <= mid) {
        temp[k] = arr[i];
        k++;
        i++;
    }
    while (j <= right) {
        temp[k] = arr[j];
        k++;
        j++;
    }
    for (int m = 0; m < temp.length; m++) {
        arr[left + m] = temp[m];
    }
}

快速排序

通过递归的方式,将数组分成两个子数组。分割的过程是:将一个数组分成两个子数组,使得左子数组的所有元素都小于右子数组的所有元素。

快速排序的时间复杂度为O(nlogn)。

以下是快速排序的Java代码示例:

public static void quickSort(int[] arr, int left, int right){
    if (left < right) {
        int pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

private static int partition(int[] arr, int left, int right){
    int pivot = arr[left];
    int i = left;
    int j = right;
    while (i < j) {
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = pivot;
    return i;
}

结语

以上就是Java中常见的排序算法。每种排序算法都有其特点和适用范围,在实际应用中需要根据具体问题来选择合适的算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 常见排序算法代码分享 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • jsp实现针对excel及word文档的打印方法

    当我们需要在JSP页面中实现自定义打印Excel及Word文档的功能,主要需要以下步骤: 在JSP页面中定义需要打印的Excel或Word文档,通常是通过使用文件名标签或者使用input type=”file”>标签上传的方式获取文件。 例如: 将上传的文件保存在服务器端,通常是通过使用Apache POI库实现。 例如: //获取上传的Excel文件…

    Java 2023年6月15日
    00
  • WIN2003下IIS6集成一个或多个Tomcat的方法

    下面是WIN2003下IIS6集成一个或多个Tomcat的步骤详解,过程中会有两条示例,供参考: 1. 安装Tomcat 首先,在Windows服务器上安装一个或多个Tomcat实例。具体步骤如下: 下载Tomcat二进制文件并解压缩到任意目录(例如 D:\tomcat)。 配置Tomcat启动方式,可以使用Windows service或Startup保持…

    Java 2023年5月20日
    00
  • Mybatis的Dao层实现原理分析

    接下来我将详细讲解Mybatis的Dao层实现原理分析的完整攻略。 什么是Dao层 Dao层是指数据访问层,它负责与数据库进行交互,完成数据的增、删、改、查等操作。在Dao层中,最常用的是SQL语句。Mybatis是一种主流的持久层框架,它的Dao层实现原理值得深入学习。 Mybatis的Dao层实现原理 1. 配置文件 Mybatis框架使用XML文件来配…

    Java 2023年5月20日
    00
  • Java UrlRewriter伪静态技术运用深入分析

    Java UrlRewriter是一种伪静态技术,可以将动态的URL转换成有意义的静态URL。要使用这种技术,需要先在网站的服务器上安装UrlRewriter组件,并对组件进行配置。以下是Java UrlRewriter伪静态技术运用的深入分析攻略: 使用Java UrlRewriter的好处 使用Java UrlRewriter的好处是,可以提高网站SEO…

    Java 2023年6月15日
    00
  • 谈谈Java中的守护线程与普通线程

    Java中的线程分为两种类型——守护线程(Daemon Thread)和普通线程(User Thread)。守护线程是一种特殊的线程,它在后台运行,主要用于Java虚拟机的一些特定操作,比如垃圾回收和内存管理等。普通线程指的是用户线程,它是我们常规开发使用的线程。 定义 在Java中通过Thread类的构造函数和setDaemon方法设置线程的daemon属…

    Java 2023年5月19日
    00
  • Java+Selenium实现控制浏览器的启动选项Options

    一、关于Java+SeleniumJava+Selenium是用于Web应用程序自动化测试的最流行的工具组合。 Selenium支持大多数浏览器,并且具有简单易用的API。 二、控制浏览器的启动选项Options当使用Java+Selenium进行Web自动化测试时,我们可以通过控制浏览器的启动选项Options来更改浏览器的一些默认设置,例如窗口大小、启动…

    Java 2023年5月20日
    00
  • java算法之余弦相似度计算字符串相似率

    Java算法之余弦相似度计算字符串相似率 介绍 余弦相似度是一种常用的字符串相似率计算方法,可以用于文本相似度计算、推荐算法等场景。本文将介绍如何在Java中实现余弦相似度算法,可用于计算两个字符串之间的相似度。 算法原理 余弦相似度的计算原理是将两个文本的词向量表示为向量,然后计算这两个向量之间的夹角余弦值,夹角余弦值越大表示两个文本之间越相似,反之则越不…

    Java 2023年5月19日
    00
  • 利用JDBC的PrepareStatement打印真实SQL的方法详解

    利用JDBC的PrepareStatement打印真实SQL的方法详解: JDBC中的PrepareStatement对象是常用的执行SQL语句的方式,通过prepareStatement构建出的SQL语句是带有参数占位符的。然而,有时候我们需要查看这个SQL语句的完整内容,包括占位符的具体值。我们可以通过以下步骤达到目的: 将占位符的具体值设置进Prepa…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部