数据结构与算法:冒泡排序

开发 前端
按照冒泡排序的思想,我们要把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位 置;当一个元素小于或等于右侧相邻元素时,位置不变。

一、定义

冒泡排序是最基础的排序算法。

冒泡排序的英文是bubble sort,它是一种基础的交换排序。

冒泡排序这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点地向着数组的一侧移动。

二、思路

按照冒泡排序的思想,我们要把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位 置;当一个元素小于或等于右侧相邻元素时,位置不变。

经过第一轮后: 元素9作为数列中最大的元素,就像是汽水里的小气泡一样,“漂”到了最右侧。

每一轮结束都会有一个元素被移到最右侧。

三、实现

1、冒泡算法

public static void main(String[] args) {
    int[] array = {1,6,2,5,3,0,3,5,4};
    array = bubbleSortBySortedExchanged(array);
    for(int i =0 ; i < array.length; i++){
        System.out.println(array[i]);
    }

}

    public static int[] bubbleSort(int[] array){
        //有array.length-1个数字需要交换
        for(int i = 0; i < array.length - 1; i++){
            //每个数字比较的次数是array.length-1-i
            for(int j = 0; j < array.length - 1 - i; j++){
                //如果当前值大于后一个值,则将更大的值移到后一位
                if(array[j] > array[j+1]){
                    swap(array[j],array[j+1]);
                }
            }
        }
        return array;
    }

   //互相交换值
    public static void swap(int a,int b){
        int temp = a;
        a  = b;
        b  = temp;
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

2、冒泡算法优化

(1)外层优化

第6轮已经可以结束了,也就是如果不需要交换了,则说明已经排好序了

思路:在外层循环处,设置标志isSort,默认为排好,如果不交换则跳出本次循环

(2)内部优化

已经被移到右侧的元素不用再参与比较了

思路:设置lastExchangeIndex标志单轮比较中最后一次比较的数值下标,下一轮比较就以lastExchangeIndex结束。

private static  int[] bubbleSortBySortedExchanged(int[] array){
    if(array == null || array.length < 2){
        return array;
    }
    //单轮比较中最后一次交换的数值下标
    int lastExchangeIndex = 0;
    int sortBorder = array.length - 1;
    //不交换则表示已排好
    boolean isSorted = true;
    for(int i = 0 ;i < array.length - 1; i++){
        for(int j = 0; j < sortBorder ; j++){
            if(array[j] > array[j+1]){
                isSorted = false;
                int temp = array[j+1];
                array[j+1] = array[j];
                array[j] = temp;
                lastExchangeIndex = j;
            }
        }
        sortBorder = lastExchangeIndex;
        if(isSorted){
            break;
        }
    }
    return array;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

四、复杂度

时间复杂度:O( n的2次方 )

空间复杂度:O(1),也就是原地排序

稳定性:相等元素之间原有的先后顺序不变,也就是稳定排序

责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-03-06 08:10:52

数据结构算法数据

2023-03-07 08:02:07

数据结构算法数列

2023-03-10 08:07:39

数据结构算法计数排序

2023-04-27 09:13:20

排序算法数据结构

2023-03-13 10:08:31

数据结构算法

2019-03-29 09:40:38

数据结构算法前端

2021-04-15 09:36:44

Java数据结构算法

2021-07-16 04:57:45

Go算法结构

2021-03-23 08:33:22

Java数据结构算法

2020-10-21 14:57:04

数据结构算法图形

2023-03-08 08:03:09

数据结构算法归并排序

2021-04-22 10:07:45

Java数据结构算法

2023-10-27 07:04:20

2021-04-16 09:40:52

Java数据结构算法

2009-08-03 17:38:12

排序算法C#数据结构

2021-10-18 11:29:48

奇偶排序数组数据结构算法

2023-02-08 07:52:36

跳跃表数据结构

2023-10-30 08:31:42

数据结构算法

2017-08-31 09:45:43

JavaArrayList数据

2023-11-06 06:43:23

单链表查询数据结构
点赞
收藏

51CTO技术栈公众号