数据结构小白之冒泡排序算法

本文深入讲解冒泡排序算法,通过实例演示排序过程,解析双循环编写技巧,展示如何通过优化减少不必要的交换,实现高效排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.冒泡排序

1-1:思路

冒泡排序的每一轮从杂乱无章的数组头部开始,每两个元素之间进行交换,直到这一轮当中最大或者最小的元素放在数组的尾部

然后去不断重复这个过程

ps:冒泡排序的核心在于双循环的编写,外层循环用来进行数组的遍历,内层循环用来进行数据的交换

 

1-2:举个栗子

假设存在数组{5,3,2,4,1},如何根据冒泡排序的特点写出算法呢?

一步一步来吧....

*先创建一个数组进行存放这些数据,加上简单遍历

   int sortArr[]={5,3,2,4,1};
        //show the array
        System.out.println("原数组");
        for (int i : sortArr) {
            System.out.print(i + " ");
        }

*进行第一轮的交换

//该方法用来进行两个数之间的交换 
public static void swap(int[] arr, int i, int j) {
        int temp = 0;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
 public static void bubbingFirstSort(int []arr){
        for (int j = 0; j < arr.length - 1 ; j++) {
        //将前一个数和后一个进行比较
            if (arr[j] > arr[j + 1]) {
                //进行两个数的交换
                swap(arr, j, j + 1);
            }
        }
        System.out.println("第1次循环");
        System.out.println(Arrays.toString(arr));

    }

*进行第二轮的交换

public static void bubbingFirstSort(int []arr){
        //由于已经把最大的数放在最后了 所以只需要比较 arr.length-2次即可
        for (int j = 0; j < arr.length - 1-1 ; j++) {
        //将前一个数和后一个进行比较
            if (arr[j] > arr[j + 1]) {
                //进行两个数的交换
                swap(arr, j, j + 1);
            }
        }
        System.out.println("第2次循环");
        System.out.println(Arrays.toString(arr));

    }

*进行n次循环

  for (int j = 0; j < array.length - 1 - (n-1); j++) {
                if (array[j] > array[j + 1]) {
                    flag=true;
                    //进行两个数的交换
                    swap(array, j, j + 1);
                }
            }
            System.out.println("第"+(i+1)+"次循环");
            System.out.println(Arrays.toString(array));

*...总结以上规律可以发现一些规律,从而套上外循环可得(注:在这里做了一些小优化,如果发现在一次循环中不去调用内层循环,说明算法已经结束了 flag=false;)

  public static void bubbingFinalSort(int[] array) {
        int temp = 0;
        boolean flag = false;
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    flag=true;
                    //进行两个数的交换
                    swap(array, j, j + 1);
                }
            }
            System.out.println("第"+(i+1)+"次循环");
            System.out.println(Arrays.toString(array));
            if(!flag){
                //说明在一趟排序中一次交换都没有发生过
                break;
            }else{
                //重置 flag进行下一次判断
                flag=false;
            }
        }

    }

*结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值