page contents

Java教程——一文搞懂Java中的排序算法

本文讲述了Java教程——一文搞懂Java中的排序算法!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2023-08-d9iMxJqI64e80347e9844.jpg

本文讲述了Java教程——一文搞懂Java中的排序算法!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

排序算法是计算机科学的基础,它们提供了一种以结构化方式组织和管理数据的方法。从搜索数据集中的特定项目到优化数据处理,排序是每个程序员的一项基本技能。在这个初学者指南中,我们将向你介绍Java中一些流行的排序算法,并提供一些例子来帮助你理解它们的实现和使用。

排序算法的关键概念

在深入研究具体的排序算法之前,了解一些基本概念是很重要的:

基于比较的排序与基于非比较的排序。基于比较的算法通过比较数据集的元素以确定它们的顺序,而非基于比较的算法则使用其他技术,如计数或弧度排序。

稳定的与不稳定的排序。一个稳定的排序算法可以保持排序输出中相等元素的相对顺序,而一个不稳定的算法则不能保证这一点。

就地排序与非就地排序。原地排序算法在原始内存位置对数据进行排序,需要最少的额外内存。离位算法则使用额外的内存来执行排序。

时间复杂度和空间复杂度。这些措施表明一个算法的性能如何随着输入数据的大小而变化,帮助你评估其效率。

Java中流行的排序算法

让我们简单介绍一下一些流行的排序算法。


泡沫排序。一种简单的基于比较的算法,它重复地浏览列表,比较相邻的元素,如果它们的顺序不对,就把它们交换。这个过程不断重复,直到列表被排序。

选择排序。另一种基于比较的算法,其工作原理是将输入分成一个已排序的区域和一个未排序的区域。它重复地从未排序区域选择最小(或最大)的元素,并将其移到排序区域的末端。

插入式排序。这种基于比较的算法每次都会建立一个排序的输出。它对小型数据集或已经部分排序的数据来说是很有效的。

合并排序。一种分而治之的算法,递归地将输入分成两半,对每一半进行排序,然后合并排序后的两半,产生最终的排序输出。

快速排序。另一种分而治之的算法,其工作原理是从列表中选择一个“支点”元素,并根据其他元素是否小于或大于支点元素,将其分成两组。然后对这些子列表进行递归排序。

在Java中实现排序算法

下面是每种算法的Java代码示例,以及对其工作原理的简要解释:


泡沫排序:

public void bubbleSort(int[] arr) {

    int n = arr.length;

    boolean swapped;

    for (int i = 0; i < n - 1; i++) {

        swapped = false;

        for (int j = 0; j < n - 1 - i; j++) {

            if (arr[j] > arr[j + 1]) {

                int temp = arr[j];

                arr[j] = arr[j + 1];

                arr[j + 1] = temp;

                swapped = true;

            }

        }

        if (!swapped) break;

    }

}

在泡沫排序中,相邻的元素会被比较,如果它们的顺序不对就会被调换。这个过程重复进行,直到不需要交换为止,表明列表已经排序。


选择排序:

public void selectionSort(int[] arr) {

    int n = arr.length;

    for (int i = 0; i < n - 1; i++) {

        int minIndex = i;

        for (int j = i + 1; j < n; j++) {

            if (arr[j] < arr[minIndex]) {

                minIndex = j;

            }

        }

        int temp = arr[minIndex];

        arr[minIndex] = arr[i];

        arr[i] = temp;

    }

}

在选择排序中,该算法将输入分为一个排序区域和一个未排序区域。它反复寻找未排序区域中的最小(或最大)元素,并将其移到排序区域的末端,直到整个列表被排序。


插入排序:

public void insertionSort(int[] arr) {

    int n = arr.length;

    for (int i = 1; i < n; i++) {

        int key = arr[i];

        int j = i - 1;

        while (j >= 0 && arr[j] > key) {

            arr[j + 1] = arr[j];

            j--;

        }

        arr[j + 1] = key;

    }

}

插入式排序的工作方式是一次建立一个排序的输出。对于每个元素,该算法将其与排序区域中的元素进行比较,如果它们大于当前元素,则将其向右移动,并将该元素插入其正确位置。


合并排序:

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

    }

}


public void merge(int[] arr, int left, int mid, int right) {

    int n1 = mid - left + 1;

    int n2 = right - mid;


    int[] leftArray = new int[n1];

    int[] rightArray = new int[n2];


    for (int i = 0; i < n1; i++) {

        leftArray[i] = arr[left + i];

    }

    for (int i = 0; i < n2; i++) {

        rightArray[i] = arr[mid + 1 + i];

    }


    int i = 0, j = 0, k = left;

    while (i < n1 && j < n2) {

        if (leftArray[i] <= rightArray[j]) {

            arr[k++] = leftArray[i++];

        } else {

            arr[k++] = rightArray[j++];

        }

    }


    while (i < n1) {

        arr[k++] = leftArray[i++];

    }

    while (j < n2) {

        arr[k++] = rightArray[j++];

    }

}

合并排序是一种分而治之的算法,它递归地将输入分成两半,对每一半进行排序,然后将排序后的两半合并,产生最终的排序输出。merge函数将两个排序的子数组合并为一个排序的数组。


快速排序

public void quickSort(int[] arr, int low, int high) {

    if (low < high) {

        int pivotIndex = partition(arr, low, high);

        quickSort(arr, low, pivotIndex - 1);

        quickSort(arr, pivotIndex + 1, high);

    }

}


public int partition(int[] arr, int low, int high) {

    int pivot = arr[high];

    int i = low - 1;

    for (int j = low; j < high; j++) {

        if (arr[j] < pivot) {

            i++;

            int temp = arr[i];

            arr[i] = arr[j];

            arr[j] = temp;

        }

    }

    int temp = arr[i + 1];

    arr[i + 1] = arr[high];

    arr[high] = temp;

    return i + 1;

}

快速排序是另一种分而治之的算法,其工作原理是从列表中选择一个“枢轴”元素,并根据其他元素是否小于或大于枢轴,将其分成两组。然后对这些子列表进行递归排序。分区函数对数组进行重新排列,并返回枢轴索引。


选择正确的排序算法

在选择排序算法时,要考虑以下因素:


数据集的大小

数据是否已经被部分排序

稳定性或额外内存使用的重要性

请记住,每种算法都有其最佳情况、平均情况和最坏情况,这些情况会影响性能。了解这些情况将有助于你根据问题和数据集选择正确的算法。


结论

了解Java中的排序算法对任何程序员都是至关重要的,因为它有助于优化数据处理和操作任务。通过练习所提供的例子和探索更高级的排序算法,你将在计算机科学的这个重要领域打下坚实的基础。欢迎你扫码关注我们,分享你在排序算法方面的经验。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Java编程语言,推荐大家关注一个微信公众号:Java圈子。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Java入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2023-03-2AoKIjPQ64014b4ad30a3.jpg

  • 发表于 2023-08-25 09:26
  • 阅读 ( 233 )
  • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
王昭君
王昭君

209 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章