冒泡排序是一种基础的入门级别的算法,它的效率比较低,但是理解它的好处是让我们对算法有初步的了解,理解了冒泡排序,不仅仅是让我们写出一个简单算法,完成入门,笔者认为写出一段程序除了能够给我们带来收入以外,如果你能从写的代码中感受到一丝快乐,这是一种精神享受。下面就让我们开始理解冒泡排序算法,然后尝试着自己去把它写出来。哪怕过了两年之后,你仍然能手到拿来,不用过多思考,那么就算是真正掌握了。
首先,冒泡排序的核心思想是:两层比较,
什么是两层比较呢?假设我现在有一个数组
int[] arr = { 56, 39, 85, 66, 34 };
这个数组显然是杂乱无章的,我们不管是要将它升序排列还是降序排列,其目的都是让它成为有序的数组。
那么,第一层比较,首先需要确定的就是,要想让这个数组有序,我需要比较几轮(注意不是比较几次)。
冒泡排序的思想是:
每经过一轮比较,我们都要确定一个最值(有可能是最大值,也有可能是最小值),对于上面的数组,我们经过第一轮比较可以确定85是最大的,但是其它元素我们仍不能确定其大小关系。
然后,在下一轮比较时,前面几轮的已经确定的最值就不用参与比较了,只需要比较剩余的元素即可,在上面的数组中,第二轮比较,显然不用考虑85了,它已经在第一轮确定为所有数字中最大的一个数字,那么,我们只需要在56,39,66,34这四个数字中再确定一个最大值,显然这个值是66.
接着是第三轮比较,此时85和66的位置已经确定了,我们只需要在56,39,34这三个数字中确定一个最大值,显然,这个值是56,
然后是第四轮比较,此时85,66,56的位置已经确定了,我们只需要在39和34中间选一个最大值,显然这个值是39.
由于85,66,56,39的位置已经确定,所以最后一个值34的位置也自动确定了(因为只有5个元素,已经占据了四个位置,那么剩下的元素只有一个位置可以选择)。
一句话总结第一层比较:对于有n个元素的数组,我需要确定n-1个元素的位置,剩下的一个位置自动确定。也就是我们需要进行n-1轮比较,比较的目的是,每一轮产生一个最值。
接下来是第二层比较:即每一轮的比较中,我们需要进行几次比较(注意,这里是几次,而不是几轮)
很显然,三个数字,为了确定一个最值,我们需要比较2次,n个数字,我们需要比较n-1次。
根据冒泡排序的特点,每一轮参与比较的元素个数,都会比上一轮少一个,所以,我们每一轮需要进行比较的次数也是递减的,这个规律是:同样的,每一轮的比较次数,会比上一轮少一次(因为元素个数少了一个)
做了上面这些准备工作以后,可以写出冒泡排序的代码了(未经优化)
package com.neusoft.baoly;
public class BubbleSort {
public static void main(String[] args) {
int[]arr = {6,5,4,3,2,1};
mySort(arr);
}
/*
*首先确定冒泡排序算法一共需要比几轮
*它的思想是每一轮确定一个最大或者最小值
*这样需要比较arr.length-1轮,因为当前面所有数字的顺序都确定以后
*最后一个数字是不需要排序的
*
*其次需要确定的是每一轮比较几次
*第一轮还没有确定最值,也就是说6个数字需要比较5次 5个数字需要比较四次
*第二轮开始之前,已经确定一个最值了,如果一共有六个数字那么第二轮开始时只有5个数字的序列
*则第二轮只需要比较四次,第三轮三次,第四轮两次,第五轮一次,由此确定代码
*
*/
public static void mySort(int []arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k]+"\t");
}
}
}
希望大家能感受到编程的乐趣,获得成就感 ^-^
转载请注明出处