一,基本思想
顾名思义,冒泡排序就像水中的气泡一样,气泡一层一层向上走,越靠近水面的气泡越大。
简单来说,冒泡排序就是从需要排序的n个数字元素的第一个数字开始,对数字进行两两比较,将两者中较大的数字向后移动。经过第一趟排序,共比较n-1次,整个数字元素中最大的数字将在整串数字末尾;经过第二趟排序,比较n-2次,第二大数字就会排在倒数第二位…
图片说明:
二,代码实现
public class TestDemo {
public static int[] Sort(int[] array){
//外层循环控制比较的趟数
for (int i = 0; i < array.length-1; i++) {
//内层循环记录比较的次数(当大数沉底后,比较次数也会随着趟数依次减少)
for (int j = 0; j < array.length-1-i; j++) {
int tmp = 0;
//进行比较并进行数值的交换
if(array[j ] > array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
return array;
}
public static void main(String[] args) {
int[] array = {25,6,56,24,9,12,55};
Sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
}
代码运行结果:
上述代码是最基本的冒泡排序方法,比较耗时耗力。如果比较数字数目较大并且有一部分数字已经有序时,那么以上方法还是会对有序的数字进行比较排序,会加大时间消耗。所以针对以上问题进行优化,我们可以提前设置一个标识order,如果此次循化下来发生了交换,则为true,否则说明排序已完成,为false。
代码实现:
public class TestDemo {
public static int[] Sort(int[] array){
//用order来记录前面的数字是否已经有序
boolean order = true;
for (int i = 0; i < array.length-1; i++) {
for (int j = 0; j < array.length-1-i; j++) {
int tmp = 0;
if(array[j ] > array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
order = true;
}
}
//如果没有发生交换,则证明已经有序,退出外部循环
if (!order){
break;
}
}
return array;
}
public static void main(String[] args) {
int[] array = {25,6,56,24,9,12,55};
Sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
}
代码运行结果:
三,特性总结
①时间复杂度:
最优时间复杂度,最差时间复杂度分析和平均时间复杂度均为 O(n^2)。
②空间复杂度:
最优的空间复杂度就是起始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是起始元素都是逆序排序的,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);
③稳定性:
稳定