冒泡排序:
冒泡排序法是一种经典的排序方法,其原理也比较好理解。顾名思义,冒泡排序是将关键字像冒泡一样完成排序。
(黑点代表带排序的关键字,有序数列在排序进行过程中,像冒泡泡一样有序的排序)
举例:
待排序列: 1 3 5 4 7 2
第一次排序:1 | 3 | 4 | 5 | 2 | 7 |
第二次排序:1 | 3 | 4 | 2 | 5 | 7 |
第三次排序:1 | 3 | 2 | 4 | 5 | 7 |
第四次排序:1 | 2 | 3 | 4 | 5 | 7 |
第五次排序:1 | 2 | 3 | 4 | 5 | 7 |
冒泡排序法的原理就是将较小的关键字往前排(或者将较大的关键字往后排)
下面是冒泡排序发的代码(Java):
public void sort(int[] a) {
for(int i = 0 ; i < a.length - 1 ; i++ ){
for(int j = 0 ; j < a.length - i - 1; j++ ){
if( less(a[j+1] , a[j]) ){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
(方法中的less()方法是比较关键字大小的方法)
关于稳定性的讨论:
排序法的稳定性的定义是:若待排序列中有两个相同的关键字 R1和R2(及R1=R2),若排序前R1在R2前面,排序后如果R1仍在R2前面,则称这种排序法是稳定的。因为冒泡排序法是比较相邻的两个关键字(完全没有必要把相等的关键字进行交换吧......),所以,冒泡排序发一种稳定的排序方法。
冒泡排序的时间复杂度:
冒泡排序法的最好的情况为正序时,其时间复杂度为O(n), 当然最坏的情况就是待排序列为逆序时,这时的时间复杂度为O(n^2),所以冒泡排序法的平均时间复杂度为
O(n^2)
空间复杂度
空间复杂度是一个算法在运行过程中临时占用存储空间大小,记做S(n)=O(f(n))。一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);所以冒泡排序的空间复杂度为S(1).