盘点几种常见的java排序算法

盘点几种常见的Java排序算法

排序算法是程序员日常开发中经常使用的基本算法之一。Java是目前最流行的编程语言之一,因此掌握Java的排序算法对于程序员来说是必须的。

本篇文章将会介绍几种Java常见的排序算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序和计数排序,一步步讲解其中的实现原理和Java代码实现。

冒泡排序

冒泡排序是一种基本的排序算法,它的实现主要通过交换两个相邻元素的位置,并重复这个过程,直到列表排好序为止。

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

public static void bubbleSort(int[] arr) {
    int temp;
    for (int i = 0; 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;
            }
        }
    }
}

选择排序

选择排序是另一种基本的排序算法,它的实现与冒泡排序很相似,只不过它是通过在未排序的列表中选择最小(或最大)元素,并将其移到已排序的列表的末尾来排序整个列表。

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

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

插入排序

插入排序基本思想是将未排序的元素插入到已排序的列表中,对于插入操作,需要将已排序元素中的所有大于该元素的元素向右移动一个位置,并将该元素插入到空出的位置上。

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

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

归并排序

归并排序是一种递归排序算法,它的基本思想是将一个大列表分成两个小列表,对这两个小列表分别进行排序后,再将这两个小列表合并成一个有序的列表。

以下是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[arr.length];
    int i = left;
    int j = mid + 1;
    int t = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[t++] = arr[i++];
        } else {
            temp[t++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[t++] = arr[i++];
    }
    while (j <= right) {
        temp[t++] = arr[j++];
    }
    t = 0;
    while (left <= right) {
        arr[left++] = temp[t++];
    }
}

快速排序

快速排序是一种基于分治的排序算法,它的基本思想是通过选定一个基准元素,将列表分成两个子列表,其中左子列表所有的元素小于或等于基准元素,右子列表所有的元素大于基准元素,然后递归地应用该算法,直到所有的子列表都有序。

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

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

堆排序

堆排序是一种基于树的排序算法,它的基本思想是将列表中的元素构造成一个最大堆(或最小堆),然后依次将堆的根节点取出,得到一个有序列表。

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

public static void heapSort(int[] arr) {
    int length = arr.length;
    //构建最大堆
    for (int i = length / 2 - 1; i >= 0; i--) {
        heapify(arr, length, i);
    }
    //依次将最大值放在堆的末尾
    for (int i = length - 1; i >= 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}

public static void heapify(int[] arr, int length, int i) {
    int left = i * 2 + 1;
    int right = i * 2 + 2;
    int largest = i;
    if (left < length && arr[left] > arr[largest]) {
        largest = left;
    }
    if (right < length && arr[right] > arr[largest]) {
        largest = right;
    }
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, length, largest);
    }
}

计数排序

计数排序是一种基于计数的排序算法,它的实现通过遍历列表中的元素,统计小于等于该元素的个数,然后将该元素放在排序列表中对应的位置上。

以下是Java的计数排序代码示例:

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

通过以上几种排序算法的介绍,读者应该能够对Java中的排序算法有一个更清晰的认识,掌握这些算法对于提高程序员的编程能力、提高代码质量是非常有帮助的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:盘点几种常见的java排序算法 - Python技术站

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

相关文章

  • Java分治法与二分搜索算法实例分析

    Java分治法与二分搜索算法实例分析 – 完整攻略 分治法 分治法(Divide and Conquer)是一种算法设计思想,它将原问题分成若干个子问题,然后将子问题逐一分解、解决,最终将子问题的解合并得到原问题的解。 分治法一般包含三个步骤:分解原问题,解决子问题,合并子问题的解。具体实现时,一般采用递归结构。 下面是一个使用分治法的例子:在一个无序数组中…

    Java 2023年5月19日
    00
  • SpringBoot中打war包需要注意事项

    SpringBoot中打war包需要注意的事项 SpringBoot默认情况下是以jar包形式运行的,如果需要将SpringBoot项目部署到Web容器中,就需要将项目打成war包。下面是几个需要注意的事项: (1)修改项目的打包方式 在pom.xml文件中,将项目打包方式设置为war,并且去掉spring-boot-starter-web依赖的scope,…

    Java 2023年5月20日
    00
  • Java文件操作类 File实现代码

    一、File类概述 在Java编程中,经常需要对文件进行操作,比如读写文件内容、创建或删除文件等。Java中提供了一个File类,能够完成文件的相关操作。 File类是用来表示一个文件或者目录(文件夹)的抽象路径名。在实际使用中需要注意,File对象表示的是在代码中的抽象概念,并不一定要对应实际存在的文件或目录。 在Java中使用File类时,需要先创建一个…

    Java 2023年5月20日
    00
  • java实现动态数组

    下面是关于Java实现动态数组的完整攻略: 什么是动态数组? 动态数组,简称为ArrayList,是在Java中使用较为广泛的数据结构之一。它是一种可变数组,可以根据需要自动扩展数组的大小。与传统的数组不同,动态数组的大小是可以根据需求动态增长或者缩小的。 Java中动态数组的实现 在Java中,动态数组的实现是通过内部维护一个Object数组来实现。当需要…

    Java 2023年5月26日
    00
  • 通过代理类实现java连接数据库(使用dao层操作数据)实例分享

    下面我就来详细讲解一下如何通过代理类实现Java连接数据库,并使用DAO层操作数据。 1. 环境准备 在开始操作之前,需要准备以下环境: JDK MySQL数据库 Eclipse或IntelliJ IDEA等Java开发工具 JDBC驱动包:MySQL的JDBC驱动包 2. 创建数据库 首先,需要创建一个名为“test”的数据库。可以使用MySQL命令行或可…

    Java 2023年5月19日
    00
  • 减少代码开发工作的Java库lombok及注解的使用学习

    这里是使用Lombok库和注解以减少Java代码开发工作的完整攻略: 1. 什么是Lombok库? Lombok是一个Java库,可以通过注解简化开发人员的代码编写量,减少样板代码的重复,从而提高代码的可读性和可维护性。使用Lombok,开发人员可以通过注解的方式自动生成getter和setter方法、构造器、日志、equals、HashCode和toStr…

    Java 2023年5月23日
    00
  • Java双冒号(::)运算符使用详解

    Java双冒号(::)运算符使用详解 什么是Java双冒号(::)运算符? Java 8 引入了一种新的运算符double colon (::),也称为双冒号运算符。它可以用在方法或构造函数的引用上,类似于Lambda表达式。 Java双冒号运算符被用来取代Lambda表达式,因为它们比Lambda表达式更加简洁。同时,使用双冒号运算符也会带来更好的性能。 …

    Java 2023年5月26日
    00
  • java写入文件的几种方法分享

    以下是Java写入文件的几种方法分享的完整攻略。 1. 概述 Java中提供了多种方式来进行文件写入。下面我们将介绍Java中常用的几种文件写入方式。 2. FileWriter方式 使用FileWriter可以向文件写入字符流。 import java.io.FileWriter; import java.io.IOException; public cl…

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