Java冒泡排序及其时间复杂度计算

  • @author Dylaniou
  • 2020-05-28 21:21

冒泡排序算法:

  • 第一轮冒泡排序
    • 第一次拿数组的第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));
				}
			}
		}
	}	
}

猜你喜欢

转载自blog.csdn.net/u010425839/article/details/106415486