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日

相关文章

  • 更改MySQL数据库的编码为utf8mb4问题

    更改MySQL数据库的编码为utf8mb4需要经历以下几个步骤: 1. 检查MySQL数据库当前编码 在终端或命令行中运行以下命令: mysql -u 用户名 -p 接着输入你的密码登录MySQL数据库,然后执行以下查询语句检查当前数据库编码: SHOW VARIABLES LIKE ‘%character%’; 2. 备份MySQL数据库 在进行更改编码之…

    Java 2023年5月20日
    00
  • spring结合struts的代码详解

    下面我来详细讲解“spring结合struts的代码详解”的完整攻略。 一、结合Spring和Struts的优势 使用Spring结合Struts开发Web应用程序,最主要的优点就是能够将Struts的ActionBean实例管理交由Spring容器,使得我们能够在ActionBean中自动注入Spring容器中的Bean,从而更加方便和灵活地开发Web应用…

    Java 2023年5月20日
    00
  • SpringBoot集成quartz实现定时任务详解

    SpringBoot集成Quartz实现定时任务详解 1. 什么是Quartz Quartz是一个开源的作业调度框架,其主要用于定时调度任务。它能够完成复杂的调度需求,如在指定时间执行任务、每天执行任务、周末执行任务等。 2. SpringBoot集成Quartz 2.1 引入依赖 我们首先需要在pom.xml文件中引入quartz和spring-boot-…

    Java 2023年5月19日
    00
  • Android源码解析之属性动画详解

    Android源码解析之属性动画详解 什么是属性动画 属性动画可以动态地改变控件的属性,例如位置、大小、颜色等。与补间动画不同,属性动画不仅可以对View对象进行操作,还可以对任意的对象进行操作,只要这个对象有对应的setter和getter方法。 属性动画的基本使用 在XML文件中定义动画: <set xmlns:android="http…

    Java 2023年6月15日
    00
  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    首先需要明确的是,BeanFactoryPostProcessor是在Spring容器实例化Bean之后,在Bean实例化之前处理BeanFactory中的BeanDefinition的接口。 一、BeanFactoryPostProcessor的使用场景 通常,在开发中,我们会利用BeanFactoryPostProcessor来修改或扩展BeanDefi…

    Java 2023年5月31日
    00
  • Java中的Lambda表达式是什么?

    下面开始详细讲解Java中的Lambda表达式是什么? Lambda表达式简介 Lambda表达式是Java 8中引入的一种代码简化方式。它可以让我们更容易地编写函数式接口的实例。 Lambda表达式用于简化函数式接口的实现,其本质上是一种可传递的匿名函数:它没有名称,但它有参数列表、函数体和可能抛出的异常列表。 Lambda表达式的语法 Lambda表达式…

    Java 2023年4月27日
    00
  • spring-boot-autoconfigure模块用法详解

    Spring Boot Autoconfigure 模块用法详解 在本文中,我们将详细讲解 Spring Boot Autoconfigure 模块的用法。我们将使用 Spring Boot 2.5.0 版本的源码进行分析。 什么是 Spring Boot Autoconfigure 模块? Spring Boot Autoconfigure 模块是 Spr…

    Java 2023年5月15日
    00
  • Java面试题冲刺第十七天–基础篇3

    Java面试题冲刺第十七天–基础篇3 在第十七天的基础篇3中,主要讲解了Java中的接口和泛型,下面将从概念、用法和示例三个方面对这两个知识点进行详细讲解。 接口 概念 接口是一种特殊的抽象类,其中的所有方法默认都是抽象的,不能包含具体实现。接口可以被多个类实现,通过接口可以实现类与类之间的松耦合。 用法 在Java中,使用interface关键字来定义接…

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