图解冒泡排序

什么是冒泡排序算法?

冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序是错误的那么就把它们交换过来

图解思路

第一趟

现在假设一下有以下五个数字(35,50,18,39,12)进行从小到大的排序
在这里插入图片描述
第一次比较(由于第一个数没有比第二个数要大 ,所以位置不变)
在这里插入图片描述


第二次比较(比较第二个数和第三个数)
在这里插入图片描述
由于第二个数字比第三个数字要大,所以要交换位置
在这里插入图片描述


第三次比较(比较第三个数和第四个数)
在这里插入图片描述
由于第三个数字比第四个数字要大,所以要交换位置
在这里插入图片描述


第四次比较(比较第四个数和第五个数)
在这里插入图片描述
由于第四个数比第五个数要大,所以要交换位置
在这里插入图片描述
到这里其实我们的排序只将五个数中最大的一个数归位了。每将一个数归位我们将其称为 “一趟”

第二趟

现在开始第二趟,目标是将第二大的数归位(黄色的的条形柱子代表已经排序好的

首先第一次比较第一个数和第二个数
在这里插入图片描述
由于第一个数比第二个数要大,所以要交换位置

在这里插入图片描述


第二次比较(由于第二个数没有比第三个数要大,所以位置不变)
在这里插入图片描述


第三次比较(比较第三个数和第四个数)
在这里插入图片描述
由于第三个数比第四个数要大,所以要交换位置
在这里插入图片描述
第二趟结束后,第二大的数字也已经排序好了

第三趟

第三趟也是跟前面两趟一样

第一次先比较第一个数和第一个数(由于第一个比第二个数要小,所以位置不变)
在这里插入图片描述


第二次比较
在这里插入图片描述
由于第二个数比第三个数要大,所以要交换位置,由于后面的都已经排序好了,所以无需交换位置
在这里插入图片描述

第四趟

第四趟比较只需要比较第一位和第二位的大小,因为后面三个都已经排序好了

比较第一个数和第二个数的代大小在这里插入图片描述
由于第一个数比第二个数要大,所以要改变位置,在这里插入图片描述
到这里基本上是排序好了

现在来回忆一下刚才比较的过程,每次都是比较 相邻的两个数,如果前面的数比后面的大,则交换两个数的位置。一直比较下去直到最后两个数比较完毕之后,最大的数就在最后一个了。就比如一个气泡,一步一步往后 “翻滚”,直到最后一位。所以这个排序的方法有一个很好听的名字 “冒泡排序”

完整动画演示

在这里插入图片描述

代码实现

package com.java.springtest.sort;

/**
 * @author Woo_home
 * @create by 2020/2/8
 */
public class Demo {

    public static int[] sort(int[] num) {
        for (int i = 0; i < num.length; i++) {
            for (int j = 0; j < num.length - 1; j++) {
            	// 判断第一个数是否大于第二个数,是则交换位置
                if (num[j] > num[j+1]) {
                    int t = num[j];
                    num[j] = num[j+1];
                    num[j+1] = t;
                }
            }
        }
        return num;
    }

    public static void main(String[] args) {
        int[] num = {8,100,50,21,15,6,1,1000,999,0};
        int[] sort = sort(num);
        for (int i : sort) {
            System.out.print(i + " ");
        }
    }
}

冒泡排序优化

package demo;

import java.util.Arrays;

public class SortDemo {

    public static void sort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            // 有序标记,每一轮的初始值都是 true
            boolean isSorted = true;
            for (int j = 0; j < array.length - i - 1; j++) {
                int temp = 0;
                if (array[j] > array[j+1]) {
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                    // 因为有元素进行交换,所以不是有序的,标记为 false
                    isSorted = false;
                }
            }
            if (isSorted) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        int[] array = new int[]{5,8,6,3,9,2,1,7};
        sort(array);
        System.out.println(Arrays.toString(array));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值