排序算法之冒泡排序(Java)

排序算法

介绍

排序的分类

  • 内部排序:将处理的数据都加载到内部存储器进行排序
  1. 插入排序
    (1)直接插入排序
    (2)希尔排序
  2. 选择排序
    (1)简单选择排序
    (2)堆排序
  3. 交换排序
    (1)冒泡排序
    (2)快速排序
  4. 归并排序
  5. 基数排序
  • 外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等进行排序

算法解析

冒泡排序

  • 基本思想:
    对于一个序列,从前往后(小下标到大下标),依次比较相邻的值,若发现逆序则交换,使较大的值慢慢浮出水面,就像冒泡一样。
  • 举例说明
原始数组:{39-1510}
  1. 第一趟排序(交换4次)
    从index=0,依次相邻的进行比较,若前面的比后面的大,则交换,即:
{3,9} ——> {9,-1} ——> {9,5} ——> {9,10}

得到排序的数组:

{3-15910}

根据第一趟排序,最大的数浮出水面(位于数组的最后)。

  1. 第二趟排序(交换3次)
    经过第一次排序,最大的数已经固定,因此我们只需要对前面4个数进行排序,交换同样按照相同的方法,得:
{-135910}

依次类推…

  1. 第三趟排序(交换2次)
    需要对前面3个数进行排序 ,得:
{-135910}
  1. 第四趟排序(交换1次)
    前面2个数进行排序,同样得:
{-135910}

经过四趟排序,一个个数都浮出水面,此时我们便完成了排序,根据上面得规律,我们可以针对算法总结如下规律(模板):

  1. 共进行了数组长度-1次的大循环(如上长度为5,一共走了4趟);
  2. 每次大循环之间交换的次数在逐渐减少1次;

示例代码
故根据上述总结,代码如下:

//冒泡排序
//arr:待排序的数组
public static void bubbleSort(int[] arr){
	//大循环:数组的长度-1
	for(int i = 0;i < arr.length- 1;i++){
		//小循环:交换次数,逐渐减少
		for(int j = 0;j < arr.length - 1 - i;j++){
			//若逆序,则交换,从小到大排序
			//从大到小:arr[j] < arr[j+1]
			if(arr[j] >= arr[j+1]){
				//交换
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] =  temp;
			} 
		}
	}
}

代码优化
我们可以从上面的示例看出,在第二趟排序之后,其实数组排序已经完成,因此是无需后面几趟,这里就是优化的点,我们可以对代码进行优化,从而判断当数组已经排序完成,则直接中止,无需后面的交换。
方法
设置标志位flag,若判断此趟中出现交换,则flag=true,否则表示此次未出现交换,排序已完成,直接退出循环。
具体代码实现

//冒泡排序
//arr:待排序的数组
public static void bubbleSort(int[] arr){
	//设置标志位,初始值为flase,;
	boolean flag = false;
	//大循环:数组的长度-1
	for(int i = 0;i < arr.length- 1;i++){
		//小循环:交换次数,逐渐减少
		for(int j = 0;j < arr.length - 1 - i;j++){
			//若逆序,则交换,从小到大排序
			//从大到小:arr[j] < arr[j+1]
			if(arr[j] >= arr[j+1]){
				//出现交换,令flag = true;
				flag = true;
				//交换
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] =  temp;
			} 
		}
		//检查flag,判断是否出现交换
		if(!flag){ //未出现交换,结束
			break;
		}else{     //出现交换,重置flag
		   flag = false;
		}
	}
}

以上就是冒泡排序的个人小结,之后也会把其他排序算法小结记录在个人博客上,以此加深自己的学习,喜欢的话,大家可以关注我或者给我点个赞,thanks!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值