标签:
Java排序,据说有八大排序,小编这次系列博客可能讲不了全部,我将自己理解比较到位的几个排序,和大家分享一下吧。今天来说一说冒泡排序,其实冒泡排序属于交换排序的一种,冒泡排序是最经典的交换排序,它的算法思想是:(假设数据存放在数组a[n]中)
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(" "); } } }小编个人比较喜欢冒泡排序,以为算法稳定,比较好理解。下篇小编将送上插入排序的讲解
标签:
原文地址:http://blog.csdn.net/u010158267/article/details/51355877