冒泡排序的基本介绍:
冒泡排序是简单的一种算法,它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果发现逆序则交换。走访元素的工作是重复地进行直到没有相邻元素需要交换,完成排序。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序算法的原理:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序流程图:
实例分析:
假如原数组中数据顺序为 1 ,4,-8,8,10
第一趟排序:
①: 1 ,4,-8,8,10 //如果相邻的元素逆序,就交换位置 ,1<4不交换
②: 1 ,-8,4,8,10 //4>-8,交换位置
?:1 ,-8,4,8,10 //4<8,不交换位置
④: 1 ,-8,4,8,10 //8<10,不交换位置
第一趟排序过后位置信息为:1 ,-8,4,8,10
第二趟排序:
①: -8,1,4,8,10
②: -8,1,4,8,10
?:-8,1,4,8,10
第二趟排序过后位置信息为:-8,1,4,8,10
第三趟排序:
①: -8,1,4,8,10
②: -8,1,4,8,10
第三趟排序过后位置信息为:-8,1,4,8,10
第四趟排序:
①: -8,1,4,8,10
第四趟排序过后的位置信息为: -8,1,4,8,10
可以得到排序规则为:
1.一共进行数组大小-1次循环
2.每一趟排序的次数在逐渐减小
代码分析:
public class BubbleSort {
public static void main(String[] args) {
//演示冒泡排序的过程
int arr[] = {1 ,4,-8,8,10};
int temp=0; //临时变量
for (int j = 0; j <arr.length-1 ; j++) {
//如果前面的数比后面的大就交换位置
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第一次排序过后:");
System.out.println(Arrays.toString(arr));
//第二趟排序,将第二大的数排在倒数第二位
for (int j = 0; j <arr.length-1-1 ; j++) {
//如果前面的数比后面的大就交换位置
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第二次排序过后:");
System.out.println(Arrays.toString(arr));
//第三趟排序,将第三大的数排在倒数第三位
for (int j = 0; j <arr.length-1-2 ; j++) {
//如果前面的数比后面的大就交换位置
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第三次排序过后:");
System.out.println(Arrays.toString(arr));
//第四趟排序,将第四大的数排在倒数第四位
for (int j = 0; j <arr.length-1-3 ; j++) {
//如果前面的数比后面的大就交换位置
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第四次排序过后:");
System.out.println(Arrays.toString(arr));
}
}
执行结果:
代码实现:
public class BubbleSort {
public static void main(String[] args) {
//演示冒泡排序的过程
int arr[] = {1 ,4,-8,8,10};
int temp=0; //临时变量
for (int i = 0; i <arr.length-1; i++) {
for (int j = 0; j <arr.length-1-i ; j++) {
//如果前面的数比后面的大就交换位置
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第"+(i+1)+"次排序过后:");
System.out.println(Arrays.toString(arr));
}
}
}
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,可以在排序过程中设置一个标志,判断是否进行过交换,做一个简单的优化。
代码实现:
public static void bubbleSort(int[] arr){
int temp=0; //临时变量
boolean flag=false; //标识变量,表示是否交换
for (int i = 0; i <arr.length-1; i++) {
for (int j = 0; j <arr.length-1-i ; j++) {
//如果前面的数比后面的大就交换位置
if(arr[j]>arr[j+1]){
flag=true;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
if(!flag){ //一次交换都没发生
break;
}else{ //重置flag,进行下次判断
flag=false;
}
}
}