• 快速排序


    冒泡排序缺点:

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

    该进点:

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

    便于编程:

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

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

    代码实现案例:

    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;
        }
        
    }
  • 相关阅读:
    第 33课 C++中的字符串(下)
    第 33课 C++中的字符串(上)
    第32课 初探C++标准库
    第31课 完善的复数类
    第30课 操作符重载
    第29课 类中的函数重载
    C++和C的相互调用
    函数重载遇上函数指针
    函数重载分析
    第2课 算法的效率问题
  • 原文地址:https://www.cnblogs.com/wanjn/p/8922786.html
Copyright © 2020-2023  润新知