冒泡排序(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));//打印输出
}
}
(有不正之处,望多多指教。)