冒泡排序【BubbleSort】

标签: BubbleSort 冒泡排序
1人阅读 评论(0) 收藏 举报
分类:

冒泡排序

假设初始的数组是[5,4,7,2] 以从小到大排序为例:

  1. 将第0个元素与第一个元素进行比较, 5 > 4, 所以交换位置, 此时[4,5,7,2]
  2. 将第1个元素与第二个元素进行比较, 5 < 7, 所以保持,此时[4,5,7,2]
  3. 将第2个元素与第三个元素进行比较, 7 > 2, 所以交换位置, 此时[4,5,2,7]

这样就经过了一轮的冒泡,最后一个元素就是最大的元素了。
根据相同的方法,开始第2轮的排序,再次从第0个元素开始,两两比较,此时不再让最后一个元素来参与比较了,因为它已经是最大值了。

总结起来:
1. 将相邻的元素两两看作一对。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。完成一次后,最后的元素会是最大的数。
3. 针对所有的元素重复以上的步骤,除了后面已经排好序的元素,直到没有任何一对数字需要比较

算法实现

public class BubbleSort {

    public void bubbleSort(int[] arr) {
        if(arr == null) {
            return ;
        }
        for(int i = arr.length - 1; i > 0; i--) {
            for(int j = 0; j < i; j++) {
                if(arr[j] > arr[j+1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp; 
    }
}

时间复杂度

不考虑初始化数据的情况,需要进行n-1次排序(n为数组长度),每一次排序需要进行n-i次比较(i为当前第几次排序)。所以时间复杂度为 O(N^2)

如果考虑数据情况,比如一开始数组就是排好序的,那么在上面的算法中加入一个标志位,一开始标志位为false,当进行过数据交换后,就将标志位变成true,当完成一次排序后,检查下标志位,如果还是为false,就表明整个数组不再需要交换位置了,此时时间复杂度变为 O(N)。 但是这只是特殊情况而已,不做参考。

稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

通俗地讲就是是否能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

查看评论

JavaScript进阶

-
  • 1970年01月01日 08:00

c/c++冒泡排序(BubbleSort)

冒泡排序的原理是,每执行一次循环,就会把最大的数放到右边,例子中arr[]={2,1,6,3,8,4,9,5,7,0};总共十个数,第一次选择最大的数需要比较9次,第二次在未排序的数中选择最大的数则就...
  • gaohuazhao
  • gaohuazhao
  • 2016-06-22 10:04:15
  • 545

冒泡排序的模板函数

将类型进行参数化,就可以制造函数模板了。下面实现冒泡排序的模板函数。 //bubbleSort.h template void bubblesort(T arr[],int n) { bool...
  • sanqima
  • sanqima
  • 2015-01-19 18:39:07
  • 1262

void BubbleSort(int *a,int n)

// BubbleSort.cpp : Defines the entry point for the console application. // #include "stdafx.h" vo...
  • autumn20080101
  • autumn20080101
  • 2012-10-26 21:49:10
  • 1595

编函数,完成冒泡排序。

/* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 作 者: 刘同宾 ...
  • liubinzi123
  • liubinzi123
  • 2012-12-02 18:47:25
  • 1848

第16周—项目1(8)冒泡排序

问题描述及代码 #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED /* *烟台大学计控学院 *作 者:杨征 *完...
  • yang66886
  • yang66886
  • 2015-12-14 17:11:41
  • 193

写一个通用的冒泡排序函数

提到通用,我们首先想到的就是模板了。 函数内部就是冒泡排序的实现了,我们看一下。//我们先写一个升序排列,一会再对它进行改造一下 template void BubbleSort(T*arr,siz...
  • lizhidefengzi
  • lizhidefengzi
  • 2017-03-21 02:46:07
  • 1070

BubbleSort 优化后的冒泡排序算法

优化后的冒泡排序算法: 在刚开始写的时候,遇到想用size_t(即unsigned int)来表示数组索引,但是在进行比较时,j出现溢出,最后用int型来表示~ 注意点在注释中写明 //优化后的冒泡排...
  • sinat_36053757
  • sinat_36053757
  • 2017-03-16 15:00:06
  • 358

冒泡排序(Bubblesort)之Java实现

冒泡排序算法介绍 冒泡排序比插入排序更简单,把最大的元素逐步推到最高位(当前须处理子数组的最高位)。依我的理解,冒泡排序是一个一层层筑顶的过程。顶筑好了,排序也就好了。冒泡排序的最坏运行时间是O(n...
  • kimylrong
  • kimylrong
  • 2013-12-04 17:54:37
  • 6519

冒泡排序练习(Bubble Sort)

一. 目的 1)交换排序就是,调整序列中不符合顺序的元素进行交换,最终序列整体符合目标次序。 2)进行冒牌排序练习。 3)算法证明: 初始:将第二个元素与第一个元素进行调整,使之符合从小到大数...
  • losteronly
  • losteronly
  • 2016-03-24 22:29:56
  • 300
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1091
    排名: 4万+
    最新评论