java-冒泡排序-简单选择排序

1 冒泡

冒泡排序动画演示: http://www.cncfan.com/html/88/5380.html   

代码:

/**
 * 冒泡排序
 * @author zm
 * 大循环和小循环要结合一起看
 * 小循环负责 当前组下找两两数字比较,找到最大/小值,并将这个最大/小值放在最后
 * 大循环负责 将组内所有数据都安排到合理的位置( eg: 6个数字组成的数组,你需要执行 6-1次的组内小循环,才能将这6个数字按照从大/小的顺序安排到合理的位置)
 */
public class BubbleSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int a[] = new int[4];
		a[0] = 8;
		a[1] = 3;
		a[2] = -1;
		a[3] = 0;
		
		bubbleSort(a);
		for(int i=0; i<a.length; i++){
			
			System.out.println(a[i]);
		}
	}
	/**
	 * 比如在i=0的第一次大循环下的小循环比较中,就会从  [8,3,-1,0]中找到最大数8,  比较结果为 [3,-1,0,8]
	 * 在        i=1的第二次大循环下,小循环就从[3,-1,0]里进行比较(int j=0; j<a.length-1-1; j++),剔除和数字8的比较,最后结果为 [-1,0,3,8]
	 */
	private static void bubbleSort(int[] a) {
		int temp;// 在单次大循环内,执行这个循环内 数组内部数据的交换操作
		// 大循环是要将数组所有数据排序按照规则排序完, 需要进行 size -1 次               
		for(int i=0; i<a.length-1; i++){ // 小循环是在 每一个大循环对应的数组内,将这个数组的最大/小 数找出,找出后这个最大/小值剔除,不作为下次大循环的比较对象   
			for(int j=0; j<a.length-1-i; j++){ // 这里的 i就表示在当次(i)大循环下,小循环中要剔除比较的数据个数
				if(a[j] > a[j+1]){
					temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
				}
			}
		}
	}

}

2 快速选择

/**
 * 简单选择排序(效率要比冒泡排序高)
 * 对n个记录进行扫描,选择最小的,进行输出
 * 对n-1访问记录进行扫描,选择最小的进行输出
 * .... 不断重复
 * 直到只剩下一个记录为止。
 * @author zm
 * 
 */
public class SelectSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int a[] = new int[4];
		a[0] = 8;
		a[1] = 3;
		a[2] = -1;
		a[3] = 0;
		
		selectSort(a);
		for(int i=0; i<a.length; i++){
			System.out.println(a[i]);
		}
	}

	// 要点是: 1 最小值初始指向最左侧元素
	private static void selectSort(int[] a) {
		// i是第几次大循环的标志位  k 总是指向最小的哪一个  j则在大循环下不断的移动
		int k;
		int tmp;
		for(int i=0; i<a.length-1; i++){
			k = i; // 每次大循环下,k总是指向当前大循环下最开始的位置
			for(int j=i; j<a.length; j++){ // 遍历当前大循环下所有数组内的数据,如果数组内的数据有比 a[k]还小的,那么将k指向最小这个数
				if(a[j] < a[k]){
					k = j; 
				}
			}
			tmp = a[i]; // 每次大循环后,将数组最左侧的数值替换成最小值
			a[i] = a[k];
			a[k] = tmp;
		}
		
	}
	
}

3 两者简单比较:

3.1 冒泡排序交换次数多于选择排序,选择排序的内存循环中交换仅仅是在内层for结束后才交换,远远小于冒泡排序


3.2 冒泡排序是将最大/小值放在数组最右侧, 选择排序是将最大/最小数放在数组最左侧。

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2102529