思想:
冒泡排序就是对一组待排序数两两比较,将他们按照升序或降序排序直到数据有序
就是这样通过两两对比的方式将最大值放到最后一个位置,第二轮就是将倒数第二大的值放到倒数第二个的位置直到数据有序 ,我们可以分析出要排序这7个数,那么我们需要循环6趟这样的过程,因为如果只剩下最后一个数那么一定是排好了的,那么我们可以写代码:
public void bubbleSort(int[] array){
for (int i = 0; i < array.length-1; i++) {
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]){
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
注意这里的j为什么是<数组长度-1是因为从下标0开始,那为什么还要-i呢?
是因为我们经过之前的i趟那么最后i个数已经是有序的了不需要我们再次比较所以-i
再想想我们还能不能再优化这个代码呢?
想想看要是我们的数列在第一趟交换中已经全部有序,那么还有必要继续进行吗,所以我们可以使用一个标记来看看这趟交换中有没有进行交换,若是都没有进行交换的话那就说明已经有序了,这个时候我们就及时止损,看下面这个代码:
public void bubbleSort(int[] array){
for (int i = 0; i < array.length-1; i++) {
boolean flg = false;
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]){
flg = true;
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
if(flg = false){
break;
}
}
}
如果有发生交换flg会变为true所以我们在出内层循环后只需要判断flg就知道是否发生了交换。
冒泡排序时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:稳定