一、原理
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点上,最后的元素即是最大的数。
3、针对所有元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
二、代码实现
package com.jdk8.SortTest;
public class BubbleSort {
public static void main(String[] args){
int[] params = new int[]{1,9,5,2,7,4,3,8};
System.out.println("排序前的数据为:");
display(params);
bubbleSorted(params);
System.out.println("排序后的数据为:");
display(params);
}
public static void display(int[] arrays){
for(int i = 0;i < arrays.length;i++){
System.out.print(" " + arrays[i] + " ");
}
}
private static void bubbleSorted(int[] params) {
if(null == params || params.length < 1){
return ;
}
int param = 0;
for(int i = 0;i < params.length;i++){
for(int j = i + 1;j < params.length;j++){
if(params[i] > params[j]){
param = params[i];
params[i] = params[j];
params[j] = param;
}
}
}
System.out.println();
}
}
运行结果如下:
排序前的数据为:
1 9 5 2 7 4 3 8
排序后的数据为:
1 2 3 4 5 7 8 9
三、复杂度分析
3.1、时间复杂度分析
时间复杂度:时间复杂度是一个函数,定量描述了算法的运算时间,用大O符号来表示。在计算的时候,先找算法基本操作的执行次数,即为T(n),然后找到它的数量级,为f(n),如果T(n)与f(n)的比值求极限可得到一个常数c,则时间复杂度T(n) = O(f(n))。
分析:冒泡排序,可以分为以下三个规则的组合:
1) 外层for循环。
2) 内层for循环。
3) 判断比较和交换位置。
因此,冒泡排序的时间复杂度为:O(n) * O(n) * O(1) = O(n^2) 。
3.2 、空间负责度
空间复杂度:空间复杂度是运行完一个程序所需要的内存的大小。即包括了存储算法本身所需要的空间,输入与输出数据所占空间,以及一些临时变量所占用的空间。一般而言,只比较额外空间,来比较算法的空间优越性。
冒泡排序的临时变量所占用的空间不随处理数据n的大小改变而改变,即空间复杂度为O(1)。
四、稳定性
冒泡排序是稳定排序。