Java 7大常见排序方法实例详解

Java 7大常见排序方法实例详解

排序算法是计算机科学中的重要技能之一,Java为开发者提供了多种常见的排序方法,本文将介绍Java 7大常见排序方法并提供详细的示例说明。

1. 冒泡排序(Bubble Sort)

冒泡排序是最简单的排序算法之一,它的思想是依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换这两个元素的位置,通过多次比较和交换,将最大的元素不断移到最后面,直到排序完成。下面是用Java实现的冒泡排序算法示例代码:

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

示例说明:通过冒泡排序算法对数组进行升序排序,时间复杂度为O(n^2)。

2. 选择排序(Selection Sort)

选择排序是一种简单的排序算法,它的思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,然后再从剩余的未排序元素中继续寻找最小(或最大)元素,依次类推,直到全部排序完毕。下面是用Java实现的选择排序算法示例代码:

public 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)。

3. 插入排序(Insertion Sort)

插入排序是一种简单排序算法,它的想法是不断将元素插入到已排序的数据中,初始时认为第一个数是已排序的数据,再把下一个数插入已排序好的数列中,直到插完所有的数为止。下面是用Java实现的插入排序算法示例代码:

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

示例说明:通过插入排序算法对数组进行升序排序,时间复杂度为O(n^2)。

4. 希尔排序(Shell Sort)

希尔排序是一种基于插入排序的排序算法,它的思想是将数组划分为若干个小组进行插入排序,通过缩小增量的方式不断缩短排序时间,直到增量为1时,算法结束。下面是用Java实现的希尔排序算法示例代码:

public 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;
            while (j >= gap && arr[j] < arr[j - gap]) {
                int temp = arr[j];
                arr[j] = arr[j - gap];
                arr[j - gap] = temp;
                j -= gap;
            }
        }
        gap /= 2;
    }
}

示例说明:通过希尔排序算法对数组进行升序排序,时间复杂度为O(n log n)。

5. 归并排序(Merge Sort)

归并排序是一种高效的排序算法,它的思想是将一个数组分成两个子数组,然后将两个子数组排序,最后将排序好的两个子数组合并成一个有序数组。下面是用Java实现的归并排序算法示例代码:

public 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);
    }
}

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

示例说明:通过归并排序算法对数组进行升序排序,时间复杂度为O(n log n)。

6. 快速排序(Quick Sort)

快速排序是一种高效的排序算法,它的思想是通过一趟排序将待排序列分成独立的两部分,其中左边部分所有元素都小于右边部分的所有元素,然后分别递归左右两部分的元素,直到整个序列有序。下面是用Java实现的快速排序算法示例代码:

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

private int partition(int[] arr, int left, int right) {
    int pivot = left;
    int index = pivot + 1;
    for (int i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
            index++;
        }
    }
    int temp = arr[pivot];
    arr[pivot] = arr[index - 1];
    arr[index - 1] = temp;
    return index - 1;
}

示例说明:通过快速排序算法对数组进行升序排序,时间复杂度为O(n log n)。

7. 堆排序(Heap Sort)

堆排序是一种树形选择排序,它的思想是将待排序序列构造成一个堆,堆顶元素是最大或最小元素,然后将堆顶元素与序列末尾元素交换位置,对剩余的序列重新构建堆,依次进行,直到整个序列有序。下面是用Java实现的堆排序算法示例代码:

public void heapSort(int[] arr) {
    int len = arr.length;
    for (int i = len / 2 - 1; i >= 0; i--) {
        heapify(arr, len, i);
    }
    for (int i = len - 1; i > 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}

private void heapify(int[] arr, int len, int i) {
    int largest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    if (l < len && arr[l] > arr[largest]) {
        largest = l;
    }
    if (r < len && arr[r] > arr[largest]) {
        largest = r;
    }
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, len, largest);
    }
}

示例说明:通过堆排序算法对数组进行升序排序,时间复杂度为O(n log n)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 7大常见排序方法实例详解 - Python技术站

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

相关文章

  • Java基础:流Stream详解

    Java基础:流Stream详解 什么是流Stream? Java中的流(Stream)是指代表数据流通的对象。Stream与java.io包中的流不同,Stream没有io操作,是一种抽象的数据结构,是一种更高级、更便捷、更优雅的处理数据的方式。Stream的目的是通过类似于流水线的方式来处理集合中的元素,通过流的操作,可以将对集合的处理变得更加简单、减少…

    Java 2023年5月26日
    00
  • Underscore源码分析

    Underscore源码分析完整攻略 简介 Underscore.js是JavaScript工具库中非常受欢迎的一个库,提供了一系列函数,可以简化JavaScript编程过程中的常见任务。其源码具有较高的可读性,并且拥有多种开发风格的版本,特别方便开发者进行源码的学习和理解。 如何获取源码 Underscore.js的最新版本可以通过官方网站或者Github…

    Java 2023年5月23日
    00
  • spring Security的自定义用户认证过程详解

    【Spring Security的自定义用户认证过程详解】 介绍 Spring Security是一个流行的安全框架,用于保护Web应用程序和REST API。Spring Security通过AuthenticationManager接口处理认证过程。该接口负责通过认证用户提供的凭据,最终生成一个用于描述身份验证后的用户认证信息 — Authenticat…

    Java 2023年5月20日
    00
  • 详解Maven settings.xml配置(指定本地仓库、阿里云镜像设置)

    详解Maven settings.xml配置(指定本地仓库、阿里云镜像设置) 在使用Maven构建Java项目的过程中,设置Maven的settings.xml配置文件可以更好地控制项目依赖包的下载以及本地仓库的位置。本文将详细介绍如何配置Maven的settings.xml文件。 本地仓库设置 本地仓库是用来存储本地构建的项目所需的依赖的地方。默认情况下,…

    Java 2023年5月20日
    00
  • Java中关于字符串的编码方式

    Java中关于字符串的编码方式,是指将字符串表示成一系列的字节序列的方式。在Java中,常见的字符串编码方式有ASCII编码、Unicode编码和UTF-8编码。 ASCII编码 ASCII编码是最基本的字符编码,它将每个字符表示成一个8位的字节,可以表示128个不同的字符。在Java中,可以使用String类的getBytes()方法将字符串按照ASCII…

    Java 2023年5月20日
    00
  • SpringBoot打印详细启动异常信息

    下面是详细讲解 SpringBoot 打印详细启动异常信息的攻略: 打印启动异常信息的原因 在启动 SpringBoot 应用的过程中,如果出现异常错误,应用程序就不会启动,而是会抛出异常。这时候我们需要查看详细的错误信息,以便知道具体出现了什么问题。 解决方法 方法一:在配置文件中进行配置 在 SpringBoot 的配置文件 application.pr…

    Java 2023年5月27日
    00
  • js实现登录与注册界面

    下面是“js实现登录与注册界面”的完整攻略: 界面设计 首先,我们需要设计一个简单美观的登录与注册界面,可以使用HTML、CSS和Bootstrap等工具来实现。其中,我们需要添加以下元素: 注册表单:包含用户输入用户名、密码、确认密码等信息的表单; 登录表单:包含用户输入用户名、密码等信息的表单; 注册和登录按钮:用于提交注册和登录表单; 反馈信息:用于提…

    Java 2023年6月15日
    00
  • Java+Ajax实现的用户名重复检验功能实例详解

    下面是关于“Java+Ajax实现的用户名重复检验功能实例详解”的完整攻略。 1. 概述 本篇攻略主要介绍如何使用Java和Ajax技术实现一个用户名重复检验功能。在用户填写用户名时,系统会自动检测该用户名是否已经被占用,如果已经被占用,则会提示用户重新填写。 2. 实现步骤 2.1 创建数据库 使用MySQL数据库,创建一个名为user的表,表中包含如下字…

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