数据结构和算法的学习-排序-冒泡排序

在数据结构课程涉及到排序章节就基本不会少了冒泡排序,废话少说,开始冒泡排序学习。
1.冒泡排序的定义。
之所以叫冒泡排序,是因为水中的气泡一定是按照下面小,上面大排列的,形成一个有序的序列(书上看的,类比还是很形象的)。
2.冒泡排序的过程(这里默认从小到大排列)
从左边开始,相邻的两个数字进行对比,后一个比前一个大就不做操作,比前一个小就交换两个数字的位置,让较大的在后面,然后再从第二个位置与下一个位置的数字做比较,重复前面的操作,直到比较到最后一个数字,这样最大的数就会在最右边,然后再从头两两比较,一直到已经排好序列的前面一个数字,下面是示例和代码。
原始数据 3 2 5 4 1 7


        第一次排序,比较32,32大,交换位置,新序列

        2  3  5  4  1  7

        第二次,位置移动到第二位也就是35比较,35小,不操作,新序列

        2  3  5  4  1  7

        第三次,位置移动到下一位,54比较,54大,交换,新序列

        2  3  4  5  1  7

        第四次,移动到下一位,51比较,5大于1,交换,新序列

        2  3  4  1  5  7

        第五次,移动到下一位,57比较,5小于7,不操作,新序列

        2  3  4  1  5  7
        这也就是第一轮的比较,让整个序列中最大的数交换到了最右边,第二轮就是重复第一轮动作,把第二大的数字移动到7之前,可以发现整个序列有6个数字,我们一共需要5轮比较,第一轮把7换到最右边,第二轮把5换到最右边,。。。剩下最后一个数就肯定是最小的了,也就不需要比较了,也就是当有N个数字我们需要比较N-1轮。其中第一轮需要比较5次才能把最大的换到最右边,以此类推,第二轮由于有一个已经确定7是最大,所以不需要再和7比较,所以需要比较4次,,不明白的话可以想象下这个画面,发现我们第一轮是第1个和第2个比,第2个和第3个比,一直到第5个和第6个比,每一轮需要比较(N-轮数)次。第一轮比较5次,6-1,第二轮有一个7确定了,减少一次,需要4次,6-2,第三轮5,7都确定了,需要3次,6-3。。。
import java.util.Scanner;

public class MaoPao {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = new int[50];
        int j=0;
        for (int i = 50; i > 0; i--) {
            arr[i-1] = j++;
        }
        //这里列举了50个数字
        sort(arr);
        //打印出排完序的数组
        for(int i=0;i<arr.length;i++) {         
            System.out.println(" "+arr[i]);
        }
    }

    //冒泡排序
    public static int[] sort(int[] arr) {
        //对于n个数据项  最多只需要n-1趟排序
        int mid = 0;
        //下标从0开始 比如数组长度10,10-1=9,i=8循环后+1,i=9,不再循环,0到8,比较了9轮,从0开始难理解可以让i从1开始,结束条件就是i<arr.length
        for(int i=0;i<arr.length-1;i++) {
            //每一趟需要比较n-1-轮数次 
            for(int j=0;j<arr.length-1-i;j++) {
                if(arr[j] > arr[j+1]) {
                //左边大于右边,交换
                    mid = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = mid;
                }
            }
        }
        return arr;
    }
}

由于冒泡算法完成对N个数的排序,第一轮需要比较N-1次,第二轮N-2,知道比较结束需要(N-1)+(N-2)+….+1=N*(N-1)/2,所以算法的时间复杂度为O(N²)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值