冒泡排序基本原理
从第一个数开始前后两个数相互比较,将两数中的较大的(较小的)向后移动,即像冒泡一样上浮。
**
时间复杂度
**
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数 均达到最小值: , 。
所以,冒泡排序最好的时间复杂度为 。
若初始文件是反序的,需要进行 趟排序。每趟排序要进行 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为 。
综上,因此冒泡排序总的平均时间复杂度为 。
N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
简单冒泡排序:
public void bubbleSort() {
int temp;
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays.length - i - 1; j++) {
if (arrays[j] > arrays[j + 1]) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arrays));
}
运行结果:
优化后冒泡排序:如果排序已完成无数据交换结束循环
public void bubbleSort_1() {
int temp;
for (int i = 0; i < arrays.length; i++) {
boolean f=true;
for (int j = 0; j < arrays.length - i - 1; j++) {
if (arrays[j] > arrays[j + 1]) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
f=false;
}
}
if(f)break;
}
System.out.println(Arrays.toString(arrays));
}
运行截图:
单for冒泡排序实现:
public void bubbleSort_2() {
int temp;
int count=arrays.length-1;
for (int i = 0; i < count; i++) {
if (arrays[i] > arrays[i + 1]) {
temp = arrays[i];
arrays[i] = arrays[i + 1];
arrays[i+ 1] = temp;
}
if(i==count-1) {
i=-1;
count-=1;
}
}
System.out.println(Arrays.toString(arrays));
}