冒泡排序缺点:

  数据比较是相邻单元,每次交互移动一位,上次比较过得数据再下次可能再次比较,产生冗余比较。导致冒泡排序的总比较次数和交换次数比较多。

该进点:

  将数据分组,组内无序,组间有序。从而减少冗余比较次数和移动次数

便于编程:

  取划分端首元素,俩端向中间烧苗的方法

  空单元在一侧,则指针从另一侧开始扫描

代码实现案例:

 

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

 

 posted on 2018-04-23 23:38  改变一下  阅读(134)  评论(0编辑  收藏  举报