冒泡排序
冒泡排序(又被称为气泡排序或泡沫排序)的基本思路???——》用两个循环条件语句嵌套;外循环是从大局来看???——》也就是遍历整个数组;那内循环呢???——》其实也就是从”外循环遍历到的地址“开始比较之后的元素,而且也是遍历的比较相邻的元素;
【例子】以数列{20,40,30,10,60,50}为例,演示它的冒泡排序过程(如下图)
该题代码实现:
/**
* 冒泡排序:Java
*
* @author skywang
* @date 2014/03/11
*/
public class BubbleSort {
/*
* 冒泡排序
*
* 参数说明:
* a -- 待排序的数组
* n -- 数组的长度
*/
public static void bubbleSort1(int[] a, int n) {
int i,j;
for (i=n-1; i>0; i--) {
// 将a[0...i]中最大的数据放在末尾
for (j=0; j<i; j++) {
if (a[j] > a[j+1]) {
// 交换a[j]和a[j+1]
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
/*
* 冒泡排序(改进版)
*
* 参数说明:
* a -- 待排序的数组
* n -- 数组的长度
*/
public static void bubbleSort2(int[] a, int n) {
int i,j;
int flag; // 标记
for (i=n-1; i>0; i--) {
flag = 0; // 初始化标记为0
// 将a[0...i]中最大的数据放在末尾
for (j=0; j<i; j++) {
if (a[j] > a[j+1]) {
// 交换a[j]和a[j+1]
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = 1; // 若发生交换,则设标记为1
}
}
if (flag==0)
break; // 若没发生交换,则说明数列已有序。
}
}
public static void main(String[] args) {
int i;
int[] a = {20,40,30,10,60,50};
System.out.printf("before sort:");
for (i=0; i<a.length; i++)
System.out.printf("%d ", a[i]);
System.out.printf("\n");
bubbleSort1(a, a.length);
//bubbleSort2(a, a.length);
System.out.printf("after sort:");
for (i=0; i<a.length; i++)
System.out.printf("%d ", a[i]);
System.out.printf("\n");
}
}
我们了解了该算法的思路,那么接下来就来该分析冒泡排序的时间和空间的复杂性!!!——》
冒泡排序时间复杂度
冒泡排序的时间复杂度是O(N^2)???——》假设被排序的数列中有N个数;遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次!;
冒泡排序稳定性
冒泡排序是稳定的算法???——》 假设在数列中存在a[ i ] = a[ j ],若在排序之前,a[ i ]在a[ j ]前面;并且排序之后,a[ i ]仍然在a[ j ]前面。则这个排序算法是稳定的;
但是这种排序不提倡,这是因为其简单性和复杂度;但是它有唯一显著优势是:它可以检测输入序列是否已经是排序的;