盘点几种常见的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中面向对象的概念及知识点总结 一、面向对象的概念 面向对象(Object-oriented,O-O)是一种软件开发思想,它主要强调将问题看作是由各种不同对象之间的交互关系构成的。 O-O 中的“对象”是指拥有属性(变量)和方法(函数)的实体。这些对象通过通信来完成特定任务。O-O 中的“类”是指一组具有相同属性和方法的对象的抽象描述。在 Java 中…

    Java 2023年5月26日
    00
  • java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    下面我将详细讲解java中常见的几种排序算法,分别为合并排序算法、冒泡排序算法、选择排序算法、插入排序算法和快速排序算法。 合并排序算法(Merge Sort) 合并排序算法也称为归并排序,其基本思想为将待排序的序列分成若干个子序列,然后对每个子序列进行排序,最后将所有子序列合并成一个有序序列。 以下是Java实现合并排序的示例代码: public stat…

    Java 2023年5月19日
    00
  • ajax对注册名进行验证检测是否存在于数据库中

    检测注册名是否已存在于数据库中是Web开发中常见的需求之一,而Ajax技术则常被用来实现前端异步验证。下面,我将为您讲解实现这一需求的完整攻略。 1. 前端实现 前端实现的主要流程如下: 给用户名输入框绑定事件 监听输入框的值变化,触发Ajax请求 将输入框的值作为参数发送给后端API 根据API的返回结果,展示相应的提示信息 示例代码如下: <inp…

    Java 2023年6月15日
    00
  • 标记-整理算法的作用是什么?

    以下是关于标记-整理算法的详细讲解: 什么是标记-整理算法? 标记-整理算法是一种常见的垃圾回收算法。其原理将内存空间分个区域,一部分为活动区,一部分为闲置区。在程序运行过程中,标记所有不再使用的内存间,然后将所有活动区的对象移动到置区,最后清空活动区,从而回收内存空间。记-整算法分为两个阶段:标记阶段整理阶段。 标记阶段 在标记阶段,垃圾收集器会遍所有的对…

    Java 2023年5月12日
    00
  • Java如何使用elasticsearch进行模糊查询

    下面是关于Java如何使用elasticsearch进行模糊查询的完整攻略。 准备工作 为了使用elasticsearch的模糊查询功能,我们需要先安装elasticsearch,然后使用Java API连接elasticsearch。这里以elasticsearch 7.15.1版本为例。 安装elasticsearch elasticsearch的安装过…

    Java 2023年5月26日
    00
  • Java实现统计字符串出现的次数

    下面来详细讲解Java实现统计字符串出现次数的完整攻略。 1. 获取待统计的字符串和要统计的字符 首先需要从用户那里获取到待统计的字符串和要统计的字符,可以使用Scanner类进行输入。示例代码如下: Scanner sc = new Scanner(System.in); System.out.println("请输入待统计的字符串:"…

    Java 2023年5月27日
    00
  • Spring整合Junit的使用详解

    我来为您讲解Spring整合Junit的使用详解。 什么是Junit Junit是一个Java语言的单元测试框架,它具有简单易用、扩展性强等特点。Junit在测试驱动开发(TDD)和行为驱动开发(BDD)中使用广泛。在Spring项目中,我们经常使用Junit来对项目进行单元测试和集成测试。 如何整合Spring和Junit 添加Spring和JUnit的依…

    Java 2023年5月19日
    00
  • Java中Date,Calendar,Timestamp的区别以及相互转换与使用

    Java中Date,Calendar,Timestamp的区别以及相互转换与使用 在Java中,Date、Calendar和Timestamp是处理日期和时间的三个主要的类。本文将详细介绍它们的区别以及如何相互转换和使用。 Date类 Date类是Java中最早的日期和时间处理类。它表示从GMT(格林尼治标准时间)1970年1月1日00:00:00时间开始至…

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