【排序】01.冒泡排序
基本思想
让最大的数浮动到数组最后的位置,其次大的数浮动到数组倒数第二个位置……即n个数,排n-1次,每次从左到右,依次两两比较大小,将最大的置后。
代码
import java.util.Arrays;
public class Solution {
public static void main(String[] args) {
int arr[] = {38,5,19,26,49,97,1,66,22};
for(int j = 0;j < arr.length-1 ;j++){ //第一层for循环:共排n-1次
for (int i = 0;i < arr.length-1-j;i++){ //第二层:每次只需排n-j个数
if (arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
改进后代码
添加flag值以判断是否排好序
import java.util.Arrays;
public class Solution {
public static void main(String[] args) {
int arr[] = {38,5,19,26,49,97,1,66,22};
int flag = 1;
for(int j = 0;j < arr.length-1 && flag == 1 ;j++){
flag = 0;
for (int i = 0;i < arr.length-1-j;i++){
if (arr[i]>arr[i+1]){
flag = 1;//如果一次排序后没有位置发生移动,则flag=0,排序结束
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
总结
冒泡排序最好情况是已排好序,按改进后算法,只需比较1次,循环n-1次,时间复杂度是
O
(
n
)
O(n)
O(n)
最坏情况是全部逆序,需比较n-1次,每次分别循环为1,2,3…n-1次,即
n
(
n
−
1
)
/
2
n(n-1)/2
n(n−1)/2,最终时间复杂度是
O
(
n
2
)
O(n^2)
O(n2)