算法详解(一) --【冒泡排序】

冒泡排序(Bubble Sort)

1.定义

一种计算机科学领域的较简单的排序算法.
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”.(此处来自网络)
说人话就是把一组数据从小到大或者从大到小排列,闲话少说,开始解析.

2.解析

随机给定一组数据:8,2,18,5,3,进行从小到大排序,即递增,我们分三个部分去分析(变量的值交换,内循环,外循环).

(1):首先我们定义两个变量a和b,并赋值,思考一下怎么交换他们的值?
交换两个变量值的方法有:定义临时变量法,运算符法,位运算法…这里我们选择定义临时变量法

//定义变量
int a = 2;
int b = 3;
int temp = 0;//临时变量
//a,b值交换
temp = a;//这里temp=2
a = b;//a重新赋值变为3,a=3
b = temp;//b重新赋值变为2,b=2

(2)内层循环,使用for循环以及if分支判断

//定义数组
int[]  arr = {8,2,18,5,3};
for(int j=0;j<5-1;j++){//定义内层循环
	if(arr[j]>arr[j+1]){//数组中前一个数和后一个数比较,如果前者大于后者,则前者和后者的值交换.
		int temp = arr[j];
		arr[j] = arr[j+1];
		arr[j+1] = temp;
	}
}	

执行过程:
① j = 0 ⇒ arr[0] = 8 > arr[0+1] = 2 所以进行交换 arr[0] = 2 arr[1] = 8
⇒ arr = { 2, 8, 18, 5, 3}
② j = 1 ⇒ arr[1] = 8 < arr[1+1] = 18 所以不进行交换 arr[1] =8 arr[2] = 18
⇒ arr = { 2, 8, 18, 5, 3}
③ j = 2 ⇒ arr[2] = 18 > arr[2+1] = 5 所以进行交换 arr[2] = 5 arr[3] = 18
⇒ arr = {2, 8, 5, 18, 3}
④ j = 3 ⇒ arr[3] = 18 > arr[3+1] =3 所以进行交换 arr[3] = 3 arr[4] = 18
⇒ arr ={2, 8, 5, 3, 18}
注:当j = 4 时 j+1 = 5 ,arr[5]不存在于数组中,所以前面 j的取值为,j<5-1 即 j<4

从执行过程我们可以看出,内循环执行结束后,该数组的最大值 18 已经成功置换到数组最右边.

(3)外循环,使用for循环

int[]  arr = {8,2,18,5,3};
for(int i=0;i<5-1;i++){
	for(int j=0;j<5-1-i;j++){//定义内层循环
	if(arr[j]>arr[j+1]){//数组中前一个数和后一个数比较,如果前者大于后者,则前者和后者的值交换.
		int temp = arr[j];
		arr[j] = arr[j+1];
		arr[j+1] = temp;
	}
  }	
}i

执行过程:
① i = 0 ⇒ (2)的内循环执行过程 ⇒ 数组最大值置于最最右边 内循环判断4次
.
.
.
④ i = 4 ⇒ (2)的内循环执行过程 ⇒ 排序成功

3.总结:

(1)综上所述,依此类推,内循环每次循环会将最大值下沉,外循环第二轮可以不用判断最后一个数,因为它已经是最大,所以“ j ” 的取值范围可以改为: j<5-1-i ,一定程度上降低时间复杂度。
(2)同理,外循环为5-1,每次都会把最大值沉底,最后两个数比较为一次,比较轮数少一次所以 :i<5-1
(3)若数组有N个元素 则:外循环次数 N-1 内循环次数 N-1-i
完整代码:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[]  arr = {8,2,18,5,3};//定义数组
        for(int i=0;i<5-1;i++){
            for(int j=0;j<5-1-i;j++){//定义内层循环
                if(arr[j]>arr[j+1]){//数组中前一个数和后一个数比较,如果前者大于后者,则前者和后者的值交换.
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));//打印输出
    }
}

(有不正之处,望多多指教。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值