现在的位置: 首页 > 综合 > 正文

交换排序之冒泡排序

2014年02月18日 ⁄ 综合 ⁄ 共 1533字 ⁄ 字号 评论关闭
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;
	}

}

抱歉!评论已关闭.