冒泡排序详解(从小到大)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014630636/article/details/51980542

冒泡排序详解

算法思路

  1. 将数列中的第一个元素和第二个元素比较数值大小,若第一个元素比第二个元素大,则交换位置。
  2. 然后再将第二个元素和第三个元素比较数值大小,第三个元素和第四个元素比较…依次不断地比较,交换。
  3. 不断循环比较,直到不再发生交换,这就表明排序已完成,此时得到就是一个有序数列。
    简单来说就是不断循环比较数列中相邻元素的数值大小,根据数组大小关系通过交换位置来调整元素中的位置,直到数列中所有的元素位置不再发生改变。

示例讲解

例如:对一个含有4个元素的数列:6,4,9,5 进行从小到大排序
第一趟(第一次循环):

初态 i=0 i=1 i=2
6 4 4 4
4 6 6 6
9 9 9 5
5 5 5 9
1. i=0
    第一次先将最前面的两个数6和4比较,6比4大,因此将4和6的位置交换
    6,4,9,5 --> 4,6,9,5
2. i=1
    第二次再将中间两个数6和9比较,6比9小,无需交换位置。
    4,6,9,5 --> 4,6.9,5
3. i=2
    第三次再将后面两个数9和5比较,9比5大,因此将9和5的位置交换
    4,6,9,5 --> 4,6,5,9

第二趟(第二次循环):

初态 i=0 i=1 i=2
4 4 4 4
6 6 5 5
5 5 6 6
9 9 9 9
 1. i=0
    第一次先将最前面的两个数4和6比较,4比6小,无需交换位置
    4,6,5,9 --> 4,6,5,9
 2. i=1
    第二次再将中间两个数6和5比较,6比5大,因此将6和5的位置交换
    4,6,5,9 --> 4,5,6,9
 3. i=2
    第三次再将后面两个数6和9比较,6比9小,无需交换位置
    4,5,6,9 --> 4,5,6,9

第三趟(第三次循环):

初态 i=0 i=1 i=2
4 4 4 4
5 5 5 5
6 6 6 6
9 9 9 9
 1. i=0
    第一次先将最前面的两个数45比较,46小,无需交换位置
 2. i=1
    第二次先将中间的两个数56比较,46小,无需交换位置
 3. i=2
    第三次先将后面的两个数69比较,46小,无需交换位置
    第三趟没有发生交换,表明排序已完成,此时得到就是一个有序数列。

算法复杂度

时间复杂度

最差情况:要排序的列表完全逆序的情况下,此时时间复杂度为O(n^2)
最好情况:要排序的列表已经排好顺序的情况下,此时只需对列表扫描一次,算法复杂度为O(n)

代码实现

/*
 * @author skyward
 */
public class BubbleSort {

public void bubbleSort(int[] numbers) {
    /**
     * true为有交换;false为无交换
     * 若无交换则表明排序完成,退出循环。否则继续排序
     */
    boolean numbersSwitched;
    do {
        numbersSwitched = false;
        for (int i = 0; i < numbers.length - 1; i++) {
            if (numbers[i + 1] < numbers[i]) {
                int tmp = numbers[i + 1];
                numbers[i + 1] = numbers[i];
                numbers[i] = tmp;
                numbersSwitched = true;
            }
        }
    } while (numbersSwitched);
}

    @Test
    public void testBubble() {
        final int[] numbers = {6, 4, 9, 5};
        //预期结果
        final int[] expected = {4, 5, 6, 9};

        bubbleSort(numbers);
        assertArrayEquals(expected, numbers);
    }
}

猜你喜欢

转载自blog.csdn.net/u014630636/article/details/51980542
今日推荐