java 算法 6种排序小结

Java算法6种排序小结

本文主要讲解Java中常用的6种排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序。下面对每个算法进行详细介绍。

冒泡排序

冒泡排序是一种简单的排序算法,它的核心思想是将相邻的元素进行两两比较,根据大小关系进行交换,一直重复这个过程,直到所有元素都有序为止。

示例代码:

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

选择排序

选择排序是一种简单的排序算法,它的核心思想是在待排序的元素中选择最小(或最大)的元素,放在已排序序列的起始位置,然后从剩余未排序的元素中继续选择最小(或最大)的元素,放到已排序序列的末尾,直到所有元素都排序完成。

示例代码:

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

插入排序

插入排序是一种简单的排序算法,它的核心思想是将待排序的元素插入到已排序序列中的合适位置,一开始已排序序列只有一个元素,然后把待排序序列中的元素一个一个插入到已排序序列中,直到所有元素都排序完成。

示例代码:

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

快速排序

快速排序是一种分治算法,它通过一趟排序将待排序序列分成独立的两部分,其中一部分所有元素都比另外一部分的所有元素都小,然后继续对这两部分分别进行快速排序,递归此过程,直到序列有序为止。

示例代码:

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]) {
            swap(arr, index, i);
            index++;
        }
    }
    swap(arr, pivot, index - 1);
    return index - 1;
}

private void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

归并排序

归并排序是采用分治法的一个非常典型的应用。其算法核心是将原始序列划分为多个子序列,直到每个子序列只有一个元素,然后进行两两归并,将划分后的序列逐个归并成为有序的序列。

示例代码:

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[] tempArr = new int[arr.length];
    int tempIndex = left;
    int leftIndex = left;
    int rightIndex = mid + 1;
    while (leftIndex <= mid && rightIndex <= right) {
        if (arr[leftIndex] <= arr[rightIndex]) {
            tempArr[tempIndex++] = arr[leftIndex++];
        } else {
            tempArr[tempIndex++] = arr[rightIndex++];
        }
    }
    while (leftIndex <= mid) {
        tempArr[tempIndex++] = arr[leftIndex++];
    }
    while (rightIndex <= right) {
        tempArr[tempIndex++] = arr[rightIndex++];
    }
    for (int i = left; i <= right; i++) {
        arr[i] = tempArr[i];
    }
}

堆排序

堆排序是一种树形选择排序,它的核心思想是将待排序序列构建成一个大顶堆或小顶堆,然后按照堆的性质依次取出堆顶元素,最终得到一个有序序列。

示例代码:

public void heapSort(int[] arr) {
    int len = arr.length;
    // 构建大顶堆
    for (int i = len / 2 - 1; i >= 0; i--) {
        maxHeapify(arr, i, len);
    }
    // 提取堆顶元素,交换并调整堆结构,再次构建大顶堆,重复此过程直到堆元素只剩一个
    for (int i = len - 1; i >= 0; i--) {
        swap(arr, 0, i);
        maxHeapify(arr, 0, i);
    }
}

private void maxHeapify(int[] arr, int i, int len) {
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int largest = i;
    if (left < len && arr[left] > arr[largest]) {
        largest = left;
    }
    if (right < len && arr[right] > arr[largest]) {
        largest = right;
    }
    if (largest != i) {
        swap(arr, i, largest);
        maxHeapify(arr, largest, len);
    }
}

private void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

以上就是Java中常用的6种排序算法的详细介绍。了解这些排序算法的原理和实现方式有助于我们更好地理解代码,提高自己的编程能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 算法 6种排序小结 - Python技术站

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

相关文章

  • Java easyexcel使用教程之导出篇

    Java easyexcel使用教程之导出篇 简介 EasyExcel 是国内开源的一个 Excel 操作库,性能卓越,并且可以使用注解方式进行 Excel 文件读写操作。在本篇文章中,我们将会介绍 EasyExcel 的导出功能。 导出 Excel 文件 引入依赖 在 pom.xml 文件中添加以下依赖: <dependency> <gr…

    Java 2023年5月19日
    00
  • 关于SQL注入绕过的一些知识点

    关于SQL注入绕过的知识点,这是一项非常复杂的话题,需要掌握的知识点比较多,下面我会给大家详细解析。 1.理解SQL注入的定义 我们首先需要清楚SQL注入是什么,顾名思义,SQL注入就是对网站中使用的SQL语句进行注入,从而达到非法获取数据或者控制网站的目的。这种攻击方式是因为开发者在编写代码的时候没有进行充分的输入验证而导致网站的漏洞造成的。 2. 理解S…

    Java 2023年6月15日
    00
  • Spring MVC 启动过程源码分析详解

    Spring MVC 启动过程源码分析详解 Spring MVC 是基于 Spring 框架的一个 Web 框架,它提供了一套用于 Web 应用程序的 MVC 实现。在本文中,我们将分析 Spring MVC 的启动过程源码,并详细说明。 Spring MVC 启动过程源码分析 第一步:加载 SpringMVC 配置文件 Spring MVC 的启动过程源码…

    Java 2023年5月16日
    00
  • Java轻松掌握面向对象的三大特性封装与继承和多态

    Java是一门面向对象编程语言,而面向对象编程的三大特性为封装、继承和多态。下面将为大家介绍如何轻松掌握这三大特性。 封装 封装是指将类的属性和方法包装在一起,隐藏了类的实现细节,使得类的使用者只需关注类的功能而不必关心其内部实现。Java中可以通过public、private、protected、default等访问修饰符来实现封装。 以下是一个示例代码,…

    Java 2023年5月26日
    00
  • Eclipse开发Hibernate应用程序

    Eclipse开发Hibernate应用程序攻略 Hibernate是一种流行的,开源的ORM(对象关系映射)框架,能够映射Java类到数据库表,使操作数据库更方便快捷。那么如何在Eclipse中使用Hibernate进行开发呢?下面是详细的攻略: 步骤一:创建Hibernate项目 打开Eclipse,点击File -> New -> Othe…

    Java 2023年5月20日
    00
  • Maven中dependency和plugins的继承与约束

    Maven 中的 dependency 和 plugins 的继承和约束机制是 Maven 中非常重要的一部分,它能够让开发者更加方便地管理项目的依赖和构建过程。在 Maven 中,我们可以通过使用 dependencyManagement 和 pluginManagement 元素来实现依赖和插件的继承和约束。 一、dependency 的继承与约束 继承…

    Java 2023年5月19日
    00
  • ssm整合shiro使用详解

    关于“ssm整合shiro使用详解”的完整攻略,我整理了以下内容: 1. 集成SSM框架 首先,我们需要集成SSM框架。SSM框架是Spring+SpringMVC+Mybatis三个框架的集成。具体步骤如下: 1.1. 搭建Spring环境 引入Spring的maven依赖: <dependency> <groupId>org.sp…

    Java 2023年6月15日
    00
  • struts2实现文件下载功能

    下面我为你详细讲解“struts2实现文件下载功能”的完整攻略。 1. 确定文件路径和文件名 在进行文件下载功能的实现之前,我们需要先确定文件的路径和文件名。一般而言,可以将文件路径和文件名存储在数据库或配置文件中。在本次实例中,我们将文件保存在了项目根目录下的uploads目录中,因此文件路径和文件名可以如下方式进行定义: String filePath …

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