冒泡排序缺点:
数据比较是相邻单元,每次交互移动一位,上次比较过得数据再下次可能再次比较,产生冗余比较。导致冒泡排序的总比较次数和交换次数比较多。
该进点:
将数据分组,组内无序,组间有序。从而减少冗余比较次数和移动次数
便于编程:
取划分端首元素,俩端向中间烧苗的方法
空单元在一侧,则指针从另一侧开始扫描
代码实现案例:
package cn.com; import java.util.Arrays; /**快速排序 * 本例子按照从小到大的顺序 * * @author Administrator * */ public class QuickSort { public static void main(String[] args) { int[] array = {90,193,200,2,4,65,89,20,190,23}; doSort(array, 0, array.length-1); System.out.println(Arrays.toString(array)); } /**递归排序每个分组内的数据 * @param array 待排数组 * @param i 每个分组的起始下标 * @param j 每个分组的结束下标 */ public static void doSort(int[] array,int i,int j){ if (i<j) { int k = sortInGroup(array, i, j);//获取第一次划分完成后划分元素的 位子 doSort(array, i, k-1);//递归划分左半段 doSort(array, k+1,j);//递归划分右半段 } } /**实现组内排序的方法 * @param array 待排序数组 * @param begin 起始位子 * @param end 结束位子 * @return 分组完毕后,分组元素在数组中的位子。这个地方采用直接返回的方式就好了,Integer是不可变的,所有实现不了引用传递的效果 */ public static int sortInGroup(int[] array,int begin,int end){ int x = array[begin];//方便编程取第一个为划分元素 int i = begin; int j = end; //开始空位在左边,扫描j,比标志大的不动,小的移动位子到空位处,i+1; //之后空格在右边,扫描i,比标志小的不动,大的移动位子到空位处,j-1; //循环里面先扫描右边,扫描的时候又是一层循环 //再扫描左边 do { while ((x<=array[j])&&(i<j)) { j--; } if (i<j) { array[i++] = array[j]; } while ((x>array[i])&&(i<j)) { i++; } if (i<j) { array[j--]=array[i]; } } while (i<j);//相等的时候说明分组完毕退出 array[i] = x;//划分元素就位 return i; } }