冒泡排序的javaSE版本及其优化,冒泡排序javase
冒泡排序的javaSE版本及其优化,冒泡排序javase
又到了大学的期末考了,有个朋友问我关于冒泡排序的问题 ,我给他详细讲了一下,前阵子刚好看到一篇关于算法的文章,里面有提到关于冒泡经典算法的优化,今天一并给大家分享一下.
冒泡排序对于计算机相关专业的同学们应该都很熟悉了吧,数据结构,java,C语言都有涉及到。
在这给大家附上比较官方的说法:
冒泡排序(Bubble Sort)是一种非常经典的排序算法。名字的来由是因为它的算法思想类似于鱼儿在河里吐泡泡的场景,例如升序排列一列数,它会两两相邻的数据进行比较,如果前者大于后者就交换,重复此番工作直到交换到最后两个数据,第一趟冒泡排序已经完成,最大的数据被冒到数组的最后一个位置,继而缩小冒泡的区间,又从头开始第二趟冒泡,直到次大数被放在倒数第二个位置,以此类推,直到所有数据被冒到合适位置,冒泡排序就算完成。
排序原理:
1)比较相邻的元素。如果第一个比第二个大(小),就交换他们两个;
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数;
3)针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序);
4)持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序;
图解:
通过图解我们可以得出结论:如果有N个数,需要进行N-1趟排序。
2.2.4 代码实现
public static void bubbleSort(int[] array){
//进行N-1趟的比较
for(int i=0; i<array.length-1; i++){
//每趟比较的内循环
for(int j=0; j<array.length -1-i; j++){
//判断相邻元素是否满足条件(递增)
if(array[j] > array[j+1]){
//交换相邻元素
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
代码优化版本:
如果数组本身已经有序,或者接近有序,以上的排序算法会做大量的无用的循环判断操作,所以我们需要对算法进行优化。
优化的方式是:设置一个标志flag为true,如果某一趟排序发生了变换,那么flag为false。如果某一趟排序没有发生交换,则说明序列已经有序了,不必再进行继续的比较操作,此时flag为true,代码如下:
public class Maopao{
public static void Sort(int[] array){
for (int i = 0; i < array.length - 1; i++) {
//每次都将bl赋值为true
boolean bl = true;
for (int j = 0; j < array.length - 1 -i; j++) {
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
bl = false;
}
}
//如果内循环走一遍之后,发现数据一次也没有交换,说明数组已经有序,则直接结束排序
if(bl == true){
break;
}
}
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
//调用冒泡排序方法,把数组传入
Sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + "\t");
}
//在java中可以使用Arrays类的排序方法进行排序
Arrays.sort(array);
for (int i : array) {
System.out.print(i+"\t");
}
}
相关文章
- 暂无相关文章
用户点评