冒泡排序原理及代码实现(Java)
冒泡排序算法的基本定义
冒泡排序是数据结构课程中一种比较简单的排序算法,其重要的思想就是相邻数据的“两两交换”,实质上就是指从第一个元素开始,依次比较相邻元素的大小,将较大的元素放在后面,然后继续比较下一组元素的大小,重复上述的操作,直到没有数据可以进行比较。
这样进行下来的操作称之为一轮操作,一轮操作结束后,这组数据中的最后一个元素便是这组数据中最大的元素。
此后再次执行新的一轮排序,即从第一个元素开始,依次两两比较相邻两个元素的大小,将较大的元素向后移一位,重复该步骤,直到没有数据可以进行比较。
一般情况下,含有n个元素的一组数据需要执行n-1轮排序操作。
具体流程示例
有一组数据 : 7 5 1 4 10 2
第一轮排序 : 7 5 1 4 10 2 初始序列。
5 7 1 4 10 2 比较数字7和5,将较大的7向后移一位。
5 1 7 4 10 2 比较数字7和1,将较大的7向后移一位。
5 1 4 7 10 2 比较数字7和4,讲较大的7向后移一位。
5 1 4 7 10 2 比较数字7和10,发现7和10本身就是有序的(较大数字在后),所以不用进行移位。
5 1 4 7 2 10 比较数字10和2,将较大的10向后移一位。
至此我们已经完成了第一轮排序,此时,序列中的最后一个数据便是这组数据中的最大元素。我们继续执行第二轮排序。
然后继续重复上面的步骤,,直到所有的元素都变成有序的序列
最后能得到有序序列 1 2 4 5 7 10。
具体的代码实现如下(Java):
//bubbSort
public static void bubbleSort(int[] array){
//优化,定义一个标志,在某一次遍历之后如果数组已经有序,就不在遍历剩下的部分了。
boolean flg = false;
int n = array.length;
for(int i = 0; i < n;i++){
for(int j = 0;j< n-i-1;j++){
if(array[j]>array[j+1]){
flg = true;
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
//如果flg为false说明此次遍历没有发生交换,也就表明当前的数组已经有序了直接跳出循环。
if(!flg){
break;
}
}
}
算法复杂度
稳定性:稳定
时间复杂度 | 空间复杂度 |
---|---|
平均复杂度:O(n^2) 最坏情况下:O(n^2) | O(1) |