盘点几种常见的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日

相关文章

  • vue + element-ui的分页问题实现

    下面是“vue + element-ui的分页问题实现”的完整攻略,包含以下几个部分: 安装element-ui和配置Vue组件 Element-ui分页组件的使用 分页数据处理及传参方式说明 1. 安装element-ui和配置Vue组件 1.1 安装element-ui 首先需要在你的项目中安装 element-ui,使用如下命令进行安装: npm in…

    Java 2023年6月16日
    00
  • Java方法的返回值及注意事项小结

    当我们在编写Java程序时,有时需要从方法中获取数据。在许多情况下,我们希望方法能够返回一个值,这就是Java方法的返回值。在本文中,将介绍Java方法的返回值以及注意事项。 什么是Java方法的返回值? Java方法的返回值是指当方法被调用时,此方法所返回的数据。方法的返回值用于与另一个方法或代码交互。一般情况下,Java方法返回值可以是任何基本数据类型(…

    Java 2023年5月26日
    00
  • java 中函数的参数传递详细介绍

    Java 中函数的参数传递详细介绍 在 Java 中,函数参数的传递方式有两种,分别是值传递和引用传递。本文将详细介绍这两种传递方式,并给出两个示例说明。 值传递 值传递是指,在调用函数时,将实参的值复制一份传递给形参。这意味着,在函数中对形参的修改不会影响实参。示例如下: public class ValuePassing { public static …

    Java 2023年5月26日
    00
  • Java避免UTF-8的csv文件打开中文出现乱码的方法

    针对“Java避免UTF-8的csv文件打开中文出现乱码”的问题,可以采取以下两种方法来解决: 方法一:使用OpenCSV库 OpenCSV是一个处理CSV文件的Java第三方库,它可以在读取或写入CSV文件时处理编码问题。可以通过以下步骤来避免在CSV文件打开中文出现乱码。 导入OpenCSV库到你的Java项目中。可以通过在pom.xml文件中添加以下依…

    Java 2023年5月20日
    00
  • Java中SimpleDateFormat日期格式转换详解及代码示例

    下面就详细讲解一下“Java中SimpleDateFormat日期格式转换详解及代码示例”的攻略。 1. 什么是SimpleDateFormat SimpleDateFormat是Java中一个非常实用的日期格式化类,它能够将日期按照指定的格式进行转换,并且还支持将字符串转换成日期。SimpleDateFormat类的格式化符号遵循类似于Unix系统下的日期…

    Java 2023年5月20日
    00
  • Java Scanner输入两个数组的方法

    为了使用Scanner输入两个数组,可以按照以下步骤进行操作: 1. 导入Scanner类 在Java中,使用Scanner来读取用户的输入。因此,首先在文件中导入Scanner类。可以使用以下代码实现此操作: import java.util.Scanner; 2. 创建Scanner对象 一旦导入Scanner类,接下来就需要创建Scanner对象。可以…

    Java 2023年5月26日
    00
  • 一篇文章教会你使用java爬取想要的资源

    使用Java进行网络数据爬取是一项常见的任务。本篇文章将详细讲解如何使用Java进行网络爬取,并提供两个示例说明。以下是爬虫攻略的详细步骤: 一、获取目标URL 首先,要确定你希望从哪个网站中获取数据。然后,你需要找到该网站中包含目标数据的具体页面。在本文的示例中,我将以 https://www.bilibili.com/ 作为目标网站。 二、分析网站结构 …

    Java 2023年5月23日
    00
  • 详解windows 10中Tomcat安装和部署的教程

    详解Windows 10中Tomcat安装和部署的教程 本教程将演示如何在Windows 10操作系统中安装和部署Tomcat服务器,以便在本地计算机上开发和测试Java Web应用程序。 步骤1:下载Tomcat安装包 在Apache Tomcat官网中下载tomcat安装包。选择所需的版本和适用于您计算机的操作系统,下载文件并保存到计算机中。 步骤2:安…

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