package cn.xingxing.datastructure.sort; import java.util.Scanner; /** * * <pre> * 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 * 由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。 * 在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序; * 初始关键字排序:38 5 19 26 49 97 1 66 * 第一次排序结果: 5 19 26 38 49 1 66 [97] * 第二次排序结果: 5 19 26 38 1 49 [66 97] * 第3次排序结果: 5 19 26 1 38 [49 66 97] * 第4次排序结果: 5 19 1 26 [38 49 66 97] * 第5次排序结果: 5 1 19 [26 38 49 1 66 97] * 第6次排序结果: 1 5 [19 26 38 49 1 66 97] * 第6次排序结果: 1 [5 19 26 38 49 1 66 97] * 最后排序结果: 1 5 19 26 38 49 1 66 97 * </pre> * * @author icecookstar * */ public class BubbleSort { /** * 交换排序 * @param a */ public static void bubbleSort(int[] a) { boolean flag = true; for (int i = 1; i < a.length && flag == true; i++) { flag = false; for (int j = 0; j < a.length - i; j++) { if (a[j] > a[j + 1]) { flag = true; int temp = a[j + 1]; a[j + 1] = a[j]; a[j] = temp; } } } printArray(a); } /** * 打印数组 * @param a */ public static void printArray(int[] a) { for (int b : a) { System.out.println(b); } } /** * @param args */ public static void main(String[] args) { // 从键盘读入数据 int[] a = receviedDateFormConsole(); bubbleSort(a); } /** * 接受六个整数 * * @return */ public static int[] receviedDateFormConsole() { Scanner sc = new Scanner(System.in); int[] a = new int[6]; int i = 0; System.out.println("请输入要排序的int整数!"); while (sc.hasNext()) { a[i] = sc.nextInt(); i++; if (i >= 6) break; } sc.close(); return a; } }