Java基本排序算法 -- 冒泡排序

一、冒泡排序

冒泡排序也称为起泡排序、气泡排序等,是一种简单的、容易理解的排序方法。
排序是通过相邻记录之间的比较和交换使关键字值较小的记录逐渐从底部移向顶部,即下标较大的单元向下标较小的单元移动,就像气泡从水中不断往上冒。当然,随着关键字较小的记录的逐渐上移,关键字值较大的记录也逐渐下移。

冒泡排序的具体作法可描述为:

  • (1)先将初始记录序列的第n个记录的关键字和第n-1个记录的关键字进行比较若发现次序相反(即逆序,R[n-1].keyR[n].key),则交换两记录;然后比较第n-1个记录和第n-2个记录,若为逆序,又交换两个记录;如此下去,直到第2个记录和第1个记录的关键字进行比较为止,这样就完成了第一趟冒泡排序。经过第一趟冒泡排序后,关键字最小的记录被放置到R[0]的位置上。
  • (2)然后再进行第二趟冒泡排序,对剩下的n-1个记录再进行类似的操作,其结果是关键字值较小的记录被放置到R[1]位置上。
  • (3)重复进行n-1趟后,整个冒泡排序结束。

在这里插入图片描述

public class ChangeSort {
	
	public static void main(String[] args) {
		ChangeSort.bubbleSort(new int[]{9,8,7,6,5,4,3,2,1,0});
	}

	/** 冒泡排序 */
	public static void bubbleSort(int[] data) {
		for (int i = 0; i < data.length - 1; i++) {
			for (int = j = 0; j < data.length - 1- i; j++) {
				if (data[j] > data[j+1]) {
					int temp = data[j];
					data[j] = data[j+1];
					data[j+1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(data));
	}
}

冒泡排序的效率分析:由以上冒泡排序算法可以看出,若初始记录序列就是正序的,则只需一趟扫描即可完成排序,此时所需的关键字比较和记录移动的次数均为最小值:Cmin=n-1,Mmin=0,即冒泡排序最好的时间复杂度为0(n);相反,若初始记录序列是反序的,则需要进行n-1越排序,每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置的目的,此时,关键字比较和记录移动的次数均达到最大值:
C   m a x   = ∑ i = 1 n ( n − i ) = n ( n − 1 ) / 2 = O ( n 2 ) C~max~= \sum_{i=1}^n (n-i)=n(n-1)/2=O(n^2) C max =i=1n(ni)=n(n1)/2=O(n2)
M   m a x   = ∑ i = 1 n 3 ( n − i ) = 3 n ( n − 1 ) / 2 = 0 ( n 2 ) M~max~= \sum_{i=1}^n 3(n-i)=3n(n-1)/2=0(n^2) M max =i=1n3(ni)=3n(n1)/2=0(n2)
M3=23(n-i)=3n(n-1)/2=0(mn2)
因此,冒泡排序的最坏时间复杂度为0(n2);在平均情况下,关键字的比较和记录的移动次数大约为最坏情况下的一半,因此冒泡排序算法的时间复杂度为0(n2)。同时,冒泡排序是一稳定的排序方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值