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 冒泡排序是将最大/小值放在数组最右侧, 选择排序是将最大/最小数放在数组最左侧。