交换排序的基本思想是对排序表中的数据元素按关键字进行两两比较,如果发生逆序,则两者交换位置,直到所有数据元素都排好序为止。
而冒泡排序属于交换排序的一种。冒泡排序的算法思想是:
- 设排序表中有n个数据元素,对第一个和第二个数据元素的关键字比较,如果第一个大,则交换。然后对第二个和第三个做同样处理。重复直到处理完最后两个元素。此为一趟冒泡,导致关键字最大的数据元素被移动到最后一个位置。
- 然后进行第二趟排序,对排序表中前n-1个元素进行上述同样的操作。
- 最多需要做n-1趟冒泡就能排序所有元素。可能会出现未到n-1趟时就已经排序好了,因此需要记录排序好的位置,然后停止排序。
代码如下:
public class App
{
public static void main(String[] arg) {
int[]array= {46,31,6,19,23,31};
bubbleSort(array);
}
public static void bubbleSort(int [] array) {
boolean flag=true;
for(int i=1;i<array.length && flag;i++) {
flag=false;
for(int j=0;j<array.length-i;j++) {
if(array[j]>array[j+1]) {
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=true;
}
}
System.out.println(Arrays.toString(array));
}
}
}
输出结果:
[31, 6, 19, 23, 31, 46]
[6, 19, 23, 31, 31, 46]
[6, 19, 23, 31, 31, 46]
最好的情况下时间复杂度为O(n),比如排序表已经从小到大排好序,算法只执行一趟冒泡,进行n-1次比较。
最坏情况下时间复杂度为O(n^2),比如排序表从大到小排序,算法要执行n-1趟冒泡。
空间复杂度S(n)=O(1)。
冒泡排序是一个稳定的排序方法。所谓稳定就是两个数据元素关键字相同时,排序后不会改变两个数据元素的相对位置。