⭐⭐⭐冒泡排序算法🌙🌙🌙:
- 第一轮冒泡排序:
- 第一次拿数组的第1位和第2位进行比较,若第1位大于第2位,则将两者的值交换,
- 再继续拿交换后的第1位与第3位进行比较,若第1位大于第3位,则将两者的值交换,
- 然后再继续拿交换后的第1位与后续位进行比较,直到第1位与后续所有位置都比较完毕,最后会发现第一轮冒泡排序的最终结果是把最小值放到了第1位;
- 第二轮冒泡排序:因为第一轮已经把最小值放到了第1位,则第二轮应该从第2位开始
- 第一次拿数组的第2位和第3位进行比较,若第2位大于第3位,则将两者的值交换,
- 再继续拿交换后的第2位与第4位进行比较,若第2位大于第4位,则将两者的值交换,
- 然后再继续拿交换后的第2位与后续位进行比较,直到第2位与后续所有位置都比较完毕,最后会发现第二轮冒泡排序的最终结果是把次小值放到了第2位;
- 后续轮次的排序思想跟前两轮类似,每次冒泡排序,都会把剩余位置里最小的那个值放到该次冒泡排序的起始位置,这样经过(数组长度-1)轮的冒泡后,就可以得到一个排好序的数组啦。
冒泡排序时间复杂度:
- 假设数组的长度为n,从上述算法表述中可得,会经历(n-1)轮冒泡,而每一轮的冒泡里面其实又经历了(n-m)次的比值交换处理,m代表的是第几轮:
- 正数第1轮,经历(n-1)次比值交换
- 正数第2轮,经历(n-2)次比值交换
- ...
- 倒数第2轮,经历2次比值交换
- 倒数第1轮,经历1次比值交换
- 故,可得,总耗费步骤为:(n-1)+(n-2)+...2+1=[(1+(n-1))(n-1)]/2=(n(n-1))/2=(n²-n)/2=n²/2-n/2,根据时间复杂度计算原则,去掉常量,低阶项,再去掉高阶项的常量系数,得到时间复杂度为T(n)= =O(n²)。
- 最优情况(O(n)):由于算法结构的限定,(n-1)轮的外层冒泡排序肯定是要进行的,而每一轮的冒泡排序里的比值交换则次数,在最优情况下,即数组已经排好序的情况下,里层的比值交换次数为0,即不需要交换。
- 最坏情况(O(n²)):与要排序的顺序完全相反,即上述时间复杂度推导过程。
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int count = 0;
int[] arr = {
5,4,3,2,1};
System.out.println("原始数组:" + Arrays.toString(arr));
for(int i=0; i<arr.length-1; i++){
System.out.println(i+1);
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
int temp = arr[j];
arr[j]=arr[i];
arr[i]=temp;
System.out.println(Arrays.toString(arr) + (++count));
}
}
}
}
}