冒泡排序算法(BubbleSort)

冒泡排序算法(BubbleSort)

冒泡排序以其“在排序过程中相邻元素不断交换,一些元素慢慢被换到最后,看起来就像是元素在冒泡一样”而得名,它是最简单的一种排序算法,通常被用来对于计算机程序设计入门算法讲解。

Definition

该算法的实现分以下几步:

  1. 每次从头开始依次比较相邻的两个元素
  2. 如果后面一个元素比前一个要小,说明顺序不对,则将它们交换
  3. 循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,不断地重复以上两个过程,直到全部有序

例如有一需要排序的数组为:5,8,6,3,9,2,1,7(从小到大排序):

第一轮排序:

1、首先5和8进行交换,发现5比8小,略过。

2、8和6比较,发现8比6大,交换位置。

在这里插入图片描述

3、8和3比较,8比3要大,交换位置。

在这里插入图片描述

4、8和9比较,8比9小,略过

5、9和2比较,9比2大,进行交换
在这里插入图片描述

6、9和1进行比较,发现9比1大,交换位置。
在这里插入图片描述

7、最后,让9和7交换位置

在这里插入图片描述

这样一来,元素9作为数列的最大元素,就已经排序好了。

在这里插入图片描述
可以看到最大的数已经排序到最后,下次就可以不用遍历已经排序好的元素。

Implementation

// 普通冒泡算法
    public static void bubbleSort(int[] arr){
    
    
        int i,j,temp,len = arr.length;
        for (i = 0; i < len -1; i++) {
    
    
            for (j = 0; j < len - 1- i; j++) {
    
    
                if(arr[j] > arr[j+1]){
    
    
                     temp = arr[j+1];
                     arr[j+1] = arr[j];
                     arr[j] = temp;
                }
            }
        }
    }

    // 改进的冒泡算法,利用flag做标记。如果在本轮排序中,元素有交换,则说明数列无序,如果没有交换,则说明数列已然有序,直接返回。
    public static void bubbleSort1(int[] arr){
    
    
        boolean flag = true;
        int temp,j = 0; //j的作用是不再遍历已经排序好的数
        while(flag){
    
    
            flag = false;
            for (int i = 0; i< arr.length -1-j;i++){
    
    
                if(arr[i] > arr[i+1]){
    
    
                    temp = arr[i+1];
                    arr[i+1] = arr[i];
                    arr[i] = temp;
                    flag = true;
                }
            }
            j++;
        }
    }

测试:

public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,2,5,6,4,2,3,1,7};
        bubbleSort1(arr);
        System.out.println(Arrays.toString(arr));
    }

结果:

[1, 1, 2, 2, 3, 4, 5, 6, 7]

图来源:lu_1079776757(原谅我不会做图)

猜你喜欢

转载自blog.csdn.net/weixin_43957211/article/details/114537830