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

相关文章

  • C#中Socket与Unity相结合示例代码

    让我来详细讲解一下“C#中Socket与Unity相结合示例代码”的完整攻略。 一、为什么要在Unity中使用Socket? Unity是一款强大的跨平台游戏引擎,可用于开发3D和2D游戏。但是,Unity的网络通信功能比较薄弱,如果想实现一些具有高度联网性的游戏功能,就必须通过Socket在Unity中实现网络通信。 二、如何在Unity中使用Socket…

    Java 2023年5月19日
    00
  • Java新手入门学习之正则表达式

    Java新手入门学习之正则表达式 什么是正则表达式? 正则表达式是一种描述字符串模式的语言,可以通过正则表达式来搜索、匹配、替换和分割文本。在Java中,可以使用Java的正则表达式API来完成对于字符串的处理。 Java中正则表达式的基本语法 Java中正则表达式的基本语法如下: pattern.matcher(str).method() 其中patter…

    Java 2023年5月27日
    00
  • 下载远程maven仓库的jar 手动放到本地仓库详细操作

    下面是下载远程maven仓库的jar 手动放到本地仓库的详细攻略: 准备工作 在进行手动安装过程前,请确保以下工作已经完成: 安装了 Maven,并配置好了环境变量。 存在一个 Maven 仓库地址,可以是远程仓库地址或本地仓库地址。 手动下载 jar 包 首先,你需要手动下载需要安装的 jar 包。可以在 Maven 仓库中寻找需要的 jar 包的地址,也…

    Java 2023年6月2日
    00
  • Java的Struts框架报错“ControllerResourcesNotFoundException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ControllerResourcesNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 控制器错误:如果控制器不正确,则可能会出现此错误。在这种情况下,需要检查控制器以解决此问题。 以下是…

    Java 2023年5月5日
    00
  • java分割日期时间段代码

    下面就让我来为您详细讲解一下“java分割日期时间段代码”的完整攻略。 1. 背景介绍 在日常开发中,经常会遇到需要把一个时间段拆分成多个小的时间段的需求,比如把一个月拆分成多个周,或者把一天拆分成多个小时等。Java中有多种方式来实现这个需求,下面我将详细介绍其中一种实现方法。 2. 实现思路 实现思路比较简单,主要是通过Java中的Calendar类来处…

    Java 2023年5月20日
    00
  • SpringBoot + Spring Security 基本使用及个性化登录配置详解

    SpringBoot+SpringSecurity基本使用 1. 引入Spring Security 在pom.xml中添加Spring Security的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin…

    Java 2023年5月15日
    00
  • Java 函数式编程梳理

    Java 函数式编程梳理攻略 什么是函数式编程? 函数式编程是一种编程范式,它将计算视为函数的求值。函数式编程强调使用不可变的值和函数,避免使用可变的状态和副作用。 Java 函数式编程的特性 Java 8 是Java中引入函数式编程的版本,通过Java语言的Lambda表达式支持了函数式编程。Java 8中最显著的函数式编程特性如下: Lambda表达式 …

    Java 2023年5月23日
    00
  • JavaIO BufferedReader和BufferedWriter使用及说明

    JavaIO BufferedReader和BufferedWriter使用及说明 在Java中,读写文件是非常频繁的操作。BufferedReader和BufferedWriter是常用的文件读写工具类。本文将详细介绍这两个工具类的使用方法及说明。 BufferedReader BufferedReader是一个用来读取字符流的缓冲区。它以一个字符输入流作…

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