简述冒泡排序

初学编程的小白来说,当学到数组和循环后,我们都会接触到排序算法的概念。排序算法常用的有10种,下面我就简单的描述一下冒泡排序这种简单容易理解的算法。

冒泡排序属于比较算法,是稳定的算法,选择算法是不稳定的算法。冒泡排序是一种极其简单的排序算法,它重复地遍历过要排序的数组元素,依次比较相邻两个元素,如果他们的顺序(从小到大或者从大到小)错误就把他们调换过来,直到遍历到最后一个元素且没有元素再需要交换,排序完成。这个算法操作起来,越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端,像气泡一样按大小的气泡一个一个的浮出水面。

尽管冒泡排序是最容易了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

冒泡排序的代码:

冒泡排序算法的步骤如下:

  1. 根据其原理可以将冒泡算法分为n(n比元素总数少1)轮,每一轮又要比较n-i(i代表第几轮)次并交换次数
  2. 每一轮比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 每一轮结束后,下一轮开始重复执行2的操作,直至一轮没有比较交换的为止。
public class Tools {
    //交换两个数的值
    public static void exchangeValue(int[] nums,int a,int b){
        int temp;
        temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }

    //随机生成m个1-n之间的数组
    public static int[] getInt(int n,int m){
        Random random = new Random();
        int[] nums = new int[m];
        for (int i = 0; i < nums.length; i++) {
            nums[i] = random.nextInt(n)+1;
        }
        return nums;
    }
}

public class BubbleSort {
    public static void main(String[] args) {
        int[] nums = Tools.getInt(100,10);
        System.out.println("排序前:");
        for (int num : nums) {
            System.out.print(num+"\t");
        }
        bubbleSort(nums);
        System.out.println("\n冒泡排序后:");
        for (int num : nums) {
            System.out.print(num+"\t");
        }
    }

    //冒泡排序
    public  static void bubbleSort(int nums[]){
        // 每次最大元素就像气泡一样"浮"到数组的最后
        for (int i = 0; i < nums.length-1; i++) {
            // 依次比较相邻的两个元素,使较大的那个向后移
            for (int j = 0; j < nums.length-1-i; j++) {
                // 如果条件改成nums[j]>=nums[j+1],则变为不稳定的排序算法
                if (nums[j]>nums[j+1]){
                    Tools.exchangeValue(nums,j,j+1);
                }
            }
        }
    }

上述代码对序列{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的实现过程如下:

Video_2020

对于其他的算法大家可以参考https://www.cnblogs.com/eniac12/p/5329396.html

 

冒泡排序-排序过程 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。 算法示例 49 13 13 13 13 13 13 13 38 49 27 27 27 27 27 27 65 38 49 38 38 38 38 38 97 65 38 49 49 49 49 49 76 97 65 49 49 49 49 49 13 76 97 65 65 65 65 65 27 27 76 97 76 76 76 76 49 49 49 76 97 97 97 97 Procedure BubbleSort(Var R : FileType) //从下往上扫描的起泡排序// Begin For I := 1 To N-1 Do //做N-1趟排序// begin NoSwap := True; //置未排序的标志// For J := N - 1 DownTo 1 Do //从底部往上扫描// begin If R[J+1]< R[J] Then //交换元素// begin Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp; NoSwap := False end; end; If NoSwap Then Return//本趟排序中未发生交换,则终止算法// end End; //BubbleSort// 该算法的时间复杂性为O(n2),算法为稳定的排序方 冒泡排序-冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。为此,我们可以考虑程序的优化。 为了标志在比较中是否进行了,设一个布尔量flag。在进行每趟比较前将flag置成true。如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值