您的位置:首页 > 编程语言 > Java开发

Java再学习-算法之冒泡排序

2016-05-09 20:48 573 查看
  

           Java排序,据说有八大排序,小编这次系列博客可能讲不了全部,我将自己理解比较到位的几个排序,和大家分享一下吧。今天来说一说冒泡排序,其实冒泡排序属于交换排序的一种,冒泡排序是最经典的交换排序,它的算法思想是:(假设数据存放在数组a
中)


  1.比较a[0]和a[1],如果a[0]>a[1],则交换a[0],a[1],然后比较新的a[1](可能是原来的a[0])和a[2],如果a[1]>a[2],则交换a[1],a[2],以此类推,直到a[n-2]和a[n-1]比较完毕,这样,a中的最大数就“沉底”了,即a[n-1]是数组a中的最大值。

  2.从头开始继续第1步的操作,所不同的是本次比较到a[n-2]即可结束,这样数组a中的次大值就被交换到a[n-2]的位置。

  3.以此比较n-1次,数组a就按照从小到大的顺序排好了。(也可以判断是否有交换发生,如果一趟比较没有发生交换,则表示数组a已经排好序)。


       理论总是很虚,直接上代码吧,因为在代码中我们才能找到自己的思路,代码中我也进行了详细的分析:

package cn.tgb.sort;

import java.util.Arrays;

//冒泡排序
public class BubbleSort {
public static void main(String[] args) {
// 生成随机数
int[] values = new int[] { (int) (Math.random() * 100),
(int) (Math.random() * 100), (int) (Math.random() * 100),
(int) (Math.random() * 100), (int) (Math.random() * 100),
(int) (Math.random() * 100), (int) (Math.random() * 100) };
//打印出随机数
System.out.println(Arrays.toString(values));
//调用排序逻辑
sort(values);
//最后打印出排序后的随机数
System.out.println(Arrays.toString(values));
}
//排序逻辑
private static void sort(int[] values) {
//定义中间变量
int temp;
//总共两套循环,外循环和内循环。从第一个数组到最后一个
//外循环第一次是0-6;第二次1-6
for (int i = 0; i < values.length; i++) {
//内循环 ,比较次数逐步减1,因为前排排好的就可以不用继续排了。
//针对下面的values.length - i - 1,我的理解是,在内部循环中
//在j和j+1(也就是最后两位)进行对比,j要进行加1,如果上面不减去一,那么下面就要写j-1和j
for (int j = 0; j < values.length - i - 1; j++) {
//比较相邻的元素,如果前面大于后面。
if (values[j] > values[j + 1]) {
//调换两个元素的位置
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}

}
//有没有这种情况 在循环结束后,顺序还是乱序的情况呢?
//打印出每次循环输出的结果。
System.out.println("第" + (i + 1) + "次排序");
for (int k = 0; k < values.length; k++) {
//采用不换行输出,便于查看
System.out.print(values[k] + " ");
}
System.out.println(" ");
}

}

}
输出结果如下:



小编在考虑这样一个问题,在第三次循环的时候,其实已经是有序化了,但是后面还要进行无用的四次排序,浪费了好多资源。这样,我们可以设置一个标志位,默认是false,当发生了一次交换后,变成true,如果在进行到第四次循环时,不进行交换,也就是说标志位依旧是false,那么我们就跳出循环,看下面代码:

package cn.tgb.sort;

import java.util.Arrays;

//冒泡排序
public class BubbleSort {
public static void main(String[] args) {
// 生成随机数
int[] values = new int[] { (int) (Math.random() * 100),
(int) (Math.random() * 100), (int) (Math.random() * 100),
(int) (Math.random() * 100), (int) (Math.random() * 100),
(int) (Math.random() * 100), (int) (Math.random() * 100) };
//打印出随机数
System.out.println(Arrays.toString(values));
//调用排序逻辑
sort(values);
//最后打印出排序后的随机数
System.out.println(Arrays.toString(values));
}
//排序逻辑
private static void sort(int[] values) {
//定义中间变量
int temp;
//标记位,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
boolean flag = false;
//总共两套循环,外循环和内循环。从第一个数组到最后一个
//外循环第一次是0-6;第二次1-6

for (int i = 0; i < values.length; i++) {
//内循环 ,比较次数逐步减1,因为前排排好的就可以不用继续排了。
//针对下面的values.length - i - 1,我的理解是,在内部循环中
//在j和j+1(也就是最后两位)进行对比,j要进行加1,如果上面不减去一,那么下面就要写j-1和j
for (int j = 0; j < values.length - i - 1; j++) {
//比较相邻的元素,如果前面大于后面。
if (values[j] > values[j + 1]) {
//调换两个元素的位置
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
//发生交换,将flag置为true
flag = true;
}

}
//没有发生交换,则表明已是有序,跳出循环
if(flag==false){
break;
}
//有没有这种情况 在循环结束后,顺序还是乱序的情况呢?
//打印出每次循环输出的结果。
System.out.println("第" + (i + 1) + "次排序");
for (int k = 0; k < values.length; k++) {
//采用不换行输出,便于查看
System.out.print(values[k] + " ");
}
System.out.println(" ");
}

}

}
小编个人比较喜欢冒泡排序,以为算法稳定,比较好理解。下篇小编将送上插入排序的讲解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: