java排序算法(四):冒泡排序
冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序、快速排序o(nlogn,底数为2).但是有两个优点
1、编程复杂度很低。很容易写出代码
2、具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的顺序。而堆排序和快速排序均不具有稳定性
不过一路、二路归并排序和不平衡二叉树排序的速度均比冒泡排序速度快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至n-i个数。若第i个数比后一个数大(则升序,小则降序)则交换两数。
冒泡排序算法稳定,o(1)额空间,比较和交换的时间复杂度都是o(n^2).自适应,对于已基本排序的算法,时间复杂度是o(n).冒泡排序算法的许多性质和插入算法相似。但对于系统开销稍高一点点。
排序过程
设想被排序的数组R[1..n]垂直树立。将每个元素看做有重量的气泡。根据轻轻炮不能在重气泡下面的原则,从下往上扫描数组R.凡扫描到违反本原则的轻气泡。就使其向上漂浮。如此反复进行。直至最后任何两个气泡都是轻者在上重着在下的原则为止。
代码实现
package com.spring.test; import sun.nio.cs.ext.ISCII91; /** * 冒泡排序测试 */ public class bubbleSortTest { public static void main(String[] args) { int[] data5 = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7}; print(data5); bubbleSort(data5); System.out.println("排序后的数组"); print(data5); } /** * 冒泡排序 * @param data */ public static void bubbleSort(int[] data){ for(int i = 0;i < data.length-1;i++){ boolean isSorted = false; for(int j=0;j<data.length-i-1;j++){ if(data[j] > data[j+1]){ swap(data,j,j+1); isSorted = true; print(data); } } if(!isSorted){ //若数组已经处于有序状态则结束排序 break; } } } /** * 对两个数据进行交换 * @param data * @param i * @param j */ public static void swap(int[] data,int i,int j){ if(i==j){ return ; } data[i] = data[i] + data[j]; data[j] = data[i] - data[j]; data[i] = data[i] - data[j]; } /** * 对数组进行打印输出 * @param data */ public static void print(int[] data){ for(int i=0;i<data.length;i++){ System.out.print(data[i]+"\t"); } System.out.println(); } }
运行结果