java排序之 --- 快速排序

来源:互联网 发布:淘宝淘口令有危险吗 编辑:程序博客网 时间:2024/05/22 14:21

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

举个小例子如图片所示(摘自百度图片):

这里写图片描述

每一次选取每部分的第一个元素作为关键数据 key,从每部分的最后一个元素开始找,找到第一个比 key 小的元素,再从头开始找,找到第一个不比 key 小的元素,然后两两交换位置,直到 key 的左边元素都小于它,右边的元素都大于或等于它。再递归比较 key 的左右两边部分从而得到排好序的序列。

核心代码:

    /**     * 把数组按关键元素 key 分割成左边小于 key,右边大于key 的两部分     * @param arr   待排序数组     * @param start 待排序部分的起始位置     * @param end   带排序部分的结束位置     * @return     * @throws Exception     */    public int partition(int[] arr,int start,int end) throws Exception {        if(arr == null || arr.length <= 0 || start < 0 || end >=arr.length) {            throw new Exception("Invalid Parameters");        }        int key = arr[start];       //选取并保存待排序部分的第一个元素为 key        while(start < end) {        //保证起始位置始终小于结束位置            while(arr[end] >= key && end > start) { //从后开始查找小于等于 key 的元素                end--;              //小于 key 的元素的下标            }            arr[start] = arr[end];  //把小于 key 的元素移动到 >= key 的位置            while(arr[start] <= key && end > start) { //从头开始查找大于等于 key 的元素                start++;            //大于 key 的元素的下标            }            arr[end] = arr[start];  //把大于 key 的元素移动到 <= key 的位置        }        arr[end] = key;             //把 key 移动到最后一个小于 key的元素位置        return end;                 //返回分割好后的 key 的下标    }    /**     *      * @param arr     * @param start     * @param end     * @throws Exception     */    public void quickSort(int[] arr,int start,int end) throws Exception {        if(start == end) return;        int index = partition(arr, start, end);         if(index > start) {            quickSort(arr, start, index-1);        }        if(index < end) {            quickSort(arr, index+1, end);        }    }

快速排序是一种不稳定的排序算法,其算法的平均时间复杂度和最优时间复杂度都是O(nlogn),但是最坏情况下(每次取到的关键元素都是最大/最小元素)时间复杂度为O(n2).

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米手机小米账号密码忘了怎么办 小米5splus没系统卡米怎么办 注册谷歌账号输入手机好怎么办 谷歌注册电话号码用了太多次怎么办 内存卡用了深度清理的软件怎么办 华为畅享5s密码忘了怎么办 小米5s进水了一直开机关机怎么办 手机菜单键功能键返回键失灵怎么办 小米5s更新系统发热严重怎么办 小米手机4G网速不好怎么办力 红米5 plus开不开机怎么办 小米3s手机触屏部分失灵怎么办 魅族手机屏幕锁密码忘了怎么办 手机没设置魅族账号密码忘了怎么办 魅族手机格式化密码忘了怎么办 魅族手机忘记密码了怎么解锁怎么办 手机设置的应用加密忘记密码怎么办 手机上设置应用加密忘记密码怎么办 魅蓝flyme密码忘了怎么办图片 魅族手机经常自动账号锁屏怎么办 魅族锁定后又不知道密码怎么办 魅族手机锁屏锁定了怎么办 魅族手机已锁定怎么办密码忘了 京东抢到了小米8不发货怎么办 第一次网上预约没有就诊卡号怎么办 京东定金交了未发货怎么办 买了没有预售许可证的房子怎么办 买了没有预售证的房子怎么办 苹果手机发烫容易变3g网怎么办 魅族手机有指纹和密码怎么办刷机 魅族手机指纹解锁密码忘了怎么办 魅蓝5s运存占用太多怎么办 魅蓝e2手机照片被删了怎么办 魅蓝e2不小心删除了照片怎么办 魅蓝3s返回键失灵怎么办 糖猫电话手表屏碎了怎么办 魅蓝手机没下安装包强制更新怎么办 老婆赌博输了30多万现在怎么办啊 红米nt2手机通话声音小怎么办? 微信退出后重新登录忘记密码怎么办 微退出后再登录忘记密码了怎么办