JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

什么是冒泡排序算法?使用Java实现一个冒泡排序算法?

wys521 2024-12-04 14:20:20 精选教程 22 ℃ 0 评论

冒泡排序算法,是一种最为常见而且最简单的排序算法。这个算法的主要实现思路就是重复的遍历需要排序的序列,然后依次比较两个元素的大小,如果顺序错误,那么就尝试交换数据的位置,如果位置正确,那么在继续往前移动进行比较。通过这种方式重复遍历,直到没有需要交换的元素为止,这也就表明序列已经正常排序完成了。冒泡排序也是由此而得名,如下所示。

冒泡排序算法实现步骤

1、从列表的第一个元素开始,比较相邻的两个元素的大小,如果前一个比后一个大,那么交换它们的位置,继续进行比较。

2、对于从前到后的每一对相邻的元素都进行步骤1的比较,从列表开始到最后一个元素结束,算是依次比较遍历,这样就可以使得最后一个元素为所有元素中最大的数据。

3、忽略已经排序完成的数据,继续执行上面的步骤,直到排序完成。

下面我们给出冒泡排序算法的Java实现代码,如下所示。

public class BubbleSort {
    public static void main(String[] args) {
        int[] array = {64, 34, 25, 12, 22, 11, 90};
        bubbleSort(array);
        System.out.println("Sorted array");
        printArray(array);
    }

    static void bubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n-1; i++) {
            for (int j = 0; j < n-i-1; j++) {
                if (arr[j] > arr[j+1]) {
                    // swap arr[j] and arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

    static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; ++i) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

其中bubbleSort用来给数组进行排序,其中n表示数组的长度,外层循环控制遍历数组的次数,内层循环用来比较相邻的两个元素,如果满足条件那么就交换,这里的条件可以根据逆序或者是顺序来进行调整。

通过上面的实现方式,我们就实现了一个最简单的排序算法,这个算法实现的时间复杂度为O(n^2),因为要相当于遍历两次数组,所以是n^2。

优化排序

我们也可以对排序算法进行优化,从而减少了不必要的操作,来提高算法的性能。其中最常见的一个优化就是通过一个算法标识来检测数组是否已经是排好序的,如果在一次内存循环结束之后,没有发生任何的数据交换,那么我们就可以知道这个数组可能是有序的,所以就可以提前退出排序的操作。如下所示。

public class BubbleSort {
    public static void main(String[] args) {
        int[] array = {64, 34, 25, 12, 22, 11, 90};
        bubbleSort(array);
        System.out.println("Sorted array:");
        printArray(array);
    }

    static 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 - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // swap arr[j] and arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }
            // If no two elements were swapped by inner loop, then break
            if (!swapped) break;
        }
    }

    static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; ++i) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

这样我们增加了一个变量标识,在每次外层循环开始时,将swapped标志设为false。在内层循环中进行交换操作时,将swapped标志设为true。然后再内存循环结束之后检查标识,如果没有交换那么仍然是false,说明已经是有序的数组了,就可以直接进行退出了,如果发生了交换那么就需要继续排序。

总结

这种优化可以显著提高冒泡排序在某些情况下的性能,尤其是当输入数组已经部分有序或者完全有序时,避免了不必要的比较和交换操作,使算法的平均性能有所提升。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表