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;
}
}