(三) 数据结构 - 冒泡排序

冒泡排序

冒泡排序是一种简单的排序算法。该排序算法是基于比较的算法,其中比较每对相邻元素,如果元素不按顺序交换。该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度为Ο(n^2),其中n是项数。

核心思想

我们以未排序的数组为例。冒泡排序需要Ο(n^2)的时间,因此我们将其简短而精确。

Bubble Sort

冒泡排序从头两个元素开始,然后比较它们以检查哪个更大。

Bubble Sort

在这种情况下,值33大于14,因此它已经在排序的位置。接下来,我们将33与27进行比较。

Bubble Sort

我们发现27小于33,并且必须交换这两个值。

Bubble Sort

新数组应如下所示:

Bubble Sort

我们知道10比35小。因此,需要进行交换

Bubble Sort

我们交换这些值。我们发现已经到达数组的末尾。一次迭代后,数组应如下所示:

Bubble Sort

确切地说,我们现在显示每次迭代后数组的外观。在第二次迭代后,它应该看起来像这样

Bubble Sort

请注意,每次迭代后,至少有一个值在末尾移动。

Bubble Sort

而且,当不需要交换时,冒泡排序会得知数组已完全排序。

Bubble Sort

代码开发

实现思路

Step 1-每次冒泡排序操作都会将相邻的两个元素进行比较
Step 2-看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序
Step 3-一次冒泡至少让一个元素移动到它应该排列的位置
Step 4-重复N次,就完成了冒泡排序

伪代码

package com.paal.demo.c01SortingBasic;

import com.paal.demo.Sort;
import com.paal.demo.utils.SortTestHelper;

/**
 * <p/>
 * <li>title: 基础排序-冒泡排序</li>
 * <li>@author: li.pan</li>
 * <li>Date: 2019/11/5 12:58 下午</li>
 * <li>Version: V1.0</li>
 * <li>Description: </li>
 */
public class BubbleSort implements Sort {

    public void sort(Integer[] arr) {

        int n = arr.length;
        for (int i = 0; i < n; i++) {

            //此处你可能会疑问的j<n-i-1,因为冒泡是把每轮循环中较大的数飘到后面,
            for (int j = 0; j < n - i - 1; j++) {
                // 数组下标又是从0开始的,i下标后面已经排序的个数就得多减1,总结就是i增多少,j的循环位置减多少
                if (arr[j] > (arr[j + 1])) {        //即这两个相邻的数是逆序的,交换
                    SortTestHelper.swap(arr, j + 1, j);
                }
            }
        }
    }
}

/**
     * 冒泡排序
     */
    @Test
    public void bubbleSortTest() {
        Integer[] integers0 = SortTestHelper.generateRandomArray(100, 0, 1000000);
        Integer[] integers1 = SortTestHelper.generateRandomArray(10000, 0, 1000000);
        Integer[] integers2 = SortTestHelper.generateRandomArray(100000, 0, 1000000);
        System.out.println("------------------------------随机数组--------------------------------");
        System.out.println("选择排序测试1数据量为100耗"+SortTestHelper.testSort(integers0, new SelectionSort()));
        System.out.println("选择排序测试2数据量为10000"+SortTestHelper.testSort(integers1, new SelectionSort()));
        System.out.println("选择排序测试3数据量为100000"+SortTestHelper.testSort(integers2, new SelectionSort()));
        System.out.println("插入排序测试1数据量为100"+SortTestHelper.testSort(integers0, new InsertionSort()));
        System.out.println("插入排序测试2数据量为10000"+SortTestHelper.testSort(integers1, new InsertionSort()));
        System.out.println("插入排序测试3数据量为100000"+SortTestHelper.testSort(integers2, new InsertionSort()));
        System.out.println("冒泡排序测试1数据量为100"+SortTestHelper.testSort(integers0, new BubbleSort()));
        System.out.println("冒泡排序测试2数据量为10000"+SortTestHelper.testSort(integers1, new BubbleSort()));
        System.out.println("冒泡排序测试3数据量为100000"+SortTestHelper.testSort(integers2, new BubbleSort()));
    }

执行结果

------------------------------随机数组--------------------------------
选择排序测试1数据量为100耗排序时长为: 0.0s
选择排序测试2数据量为10000排序时长为: 0.092s
选择排序测试3数据量为100000排序时长为: 7.589s
插入排序测试1数据量为100排序时长为: 0.0s
插入排序测试2数据量为10000排序时长为: 0.001s
插入排序测试3数据量为100000排序时长为: 0.004s
冒泡排序测试1数据量为100排序时长为: 0.0s
冒泡排序测试2数据量为10000排序时长为: 0.051s
冒泡排序测试3数据量为100000排序时长为: 8.988s
发布了87 篇原创文章 · 获赞 69 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/lp284558195/article/details/102913914