亚游wwwag8com
你好,游客 登录 注册
背景:
阅读新闻

Java快速排序图文详解

[日期:2019-05-23] 来源:Linux社区  作者:Linux [字体: ]

高快省的排序算法

亚游wwwag8com,其三,可能也是最重要的是,北京打造新机构制度。亚洲基础设施投资银行就是一个例子,“一带一路”也是一项雄心勃勃的计划。

为此,泛华集团董事长杨天举表示,新型城镇化作为生态文明建设的重要载体和抓手,已经进入破解深层矛盾的关键期,它的增长方式迫切需要从外延式向内涵式过渡,速度型向效益型过渡,从粗放型向质量型过渡、从资源驱动向创新驱动、战略驱动转变,在这种背景下,新型城镇化尤其是中小城市的新型城镇化应该与生态文明融合发展,积极构建经济、社会、文化等生态化发展格局,推进新型城镇化的可持续发展能力。光天化日用弹珠破车窗行窃 只为“整点过年钱”该举的目的显而易见:微软想要吸引高端笔记本用户转用其性能强大的新Windows设备。“没有产品线能够在性能、便携性和多功能性上比得上Surface系列。”微软当时表示,“如果你有Mac但想要体验带触控屏的旗舰级笔记本,那Surface和微软商店便是最好的选择。”

有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端。

假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:

3 1 2 5 4 6 9 7 10 8

在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。

排序算法

方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从找一个小于6的数,再从找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。

这里写图片描述
首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)。哨兵j一步一步地向左挪动(即j–),直到找到一个小于6的数停下来。接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。
这里写图片描述
这里写图片描述
现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下:

6 1 2 5 9 3 4 7 10 8
这里写图片描述
这里写图片描述
到此,第一次交换结束。接下来开始哨兵j继续向左挪动(再友情提醒,每次必须是哨兵j先出发)。他发现了4(比基准数6要小,满足要求)之后停了下来。哨兵i也继续向右挪动的,他发现了9(比基准数6要大,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下:

6 1 2 5 4 3 9 7 10 8

第二次交换结束,“探测”继续。哨兵j继续向左挪动,他发现了3(比基准数6要小,满足要求)之后又停了下来。哨兵i继续向右移动,糟啦!此时哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。说明此时“探测”结束。我们将基准数6和3进行交换。交换之后的序列如下:

3 1 2 5 4 6 9 7 10 8

这里写图片描述
这里写图片描述
这里写图片描述

到此第一轮“探测”真正结束。此时以基准数6为分界点,6左边的数都小于等于6,6右边的数都大于等于6。回顾一下刚才的过程,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。

OK,解释完毕。现在基准数6已经归位,它正好处在序列的第6位。此时我们已经将原来的序列,以6为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。接下来还需要分别处理这两个序列。因为6左边和右边的序列目前都还是很混乱的。不过不要紧,我们已经掌握了方法,接下来只要模拟刚才的方法分别处理6左边和右边的序列即可。现在先来处理6左边的序列现吧。

左边的序列是“3 1 2 5 4”。请将这个序列以3为基准数进行调整,使得3左边的数都小于等于3,3右边的数都大于等于3。好了开始动笔吧

如果你模拟的没有错,调整完毕之后的序列的顺序应该是:

2 1 3 5 4

OK,现在3已经归位。接下来需要处理3左边的序列“2 1”和右边的序列“5 4”。对序列“2 1”以2为基准数进行调整,处理完毕之后的序列为“1 2”,到此2已经归位。序列“1”只有一个数,也不需要进行任何处理。至此我们对序列“2 1”已全部处理完毕,得到序列是“1 2”。序列“5 4”的处理也仿照此方法,最后得到的序列如下:

1 2 3 4 5 6 9 7 10 8

对于序列“9 7 10 8”也模拟刚才的过程,直到不可拆分出新的子序列为止。最终将会得到这样的序列,如下

1 2 3 4 5 6 7 8 9 10

到此,排序完全结束。细心的同学可能已经发现,快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。
这里写图片描述

这是为什么呢?

快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。先上代码,如下

代码实现:

public class linuxidc {
    public static void linuxidc(int[] arr,int low,int high){
        int i,j,temp,t;
        if(low>high){
            return;
        }
        i=low;
        j=high;
        /temp就是基准位
        temp = arr[low];

        while (i<j) {
            /先从右边,依次往左递减
            while (temp<=arr[j]&&i<j) {
                j--;
            }
            /再从左边,依次往右递增
            while (temp>=arr[i]&&i<j) {
                i++;
            }
            /如果满足条件则交换
            if (i<j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }

        }
        /最后将基准为与i和j相等位置的数字交换
         arr[low] = arr[i];
         arr[i] = temp;
        /递归调用左半数组
        linuxidc(arr, low, j-1);
        /递归调用右半数组
        linuxidc(arr, j+1, high);
    }


    public static void main(String[] args){
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        linuxidc(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

Java快速排序图文详解

快排之三数取中法

  在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。

Java快速排序图文详解

根据枢纽值进行分割

Java快速排序图文详解

Java快速排序图文详解

代码实现:

public class linuxidc {
    public static void main(String[] args) {
        int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
        linuxidc(arr, 0, arr.length - 1);
        System.out.println("排序结果:" + Arrays.toString(arr));
    }

    /**
     * 排序
     */
    public static void linuxidc(int[] arr, int left, int right) {
        if (left < right) {
            /获取枢纽值,并将其放在当前待处理序列末尾
            dealPivot(arr, left, right);
            /枢纽值被放在序列末尾
            int pivot = right - 1;
            /左指针
            int i = left;
            /右指针
            int j = right - 1;
            while (true) {
                while (arr[++i] < arr[pivot]) {
                }
                while (j > left && arr[--j] > arr[pivot]) {
                }
                if (i < j) {
                    swap(arr, i, j);
                } else {
                    break;
                }
            }
            if (i < right) {
                swap(arr, i, right - 1);
            }
            linuxidc(arr, left, i - 1);
            linuxidc(arr, i + 1, right);
        }

    }

    /**
     * 处理枢纽值
     */
    public static void dealPivot(int[] arr, int left, int right) {
        int mid = (left + right) / 2;
        if (arr[left] > arr[mid]) {
            swap(arr, left, mid);
        }
        if (arr[left] > arr[right]) {
            swap(arr, left, right);
        }
        if (arr[right] < arr[mid]) {
            swap(arr, right, mid);
        }
        swap(arr, right - 1, mid);
    }

    /**
     * 交换元素通用处理
     */
    private static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

更多亚游wwwag8comJava相关信息见Java 专题页面 亚游wwwag8com/wwwd35clinuxidcd35ccom/topicnews.aspx?tid=19

Linux公社的RSS地址亚游wwwag8com/wwwd35clinuxidcd35ccom/rssFeed.aspx

本文永久更新链接地址/wwwd35clinuxidcd35ccom/Linux/2019-05/158819.htm

linux
相关资讯       快速排序  Java快速排序 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
22%用户将购买新款iPhone 大屏和售价为主要考虑… 商务部:中美未就301征税清单进行任何双边谈判 保姆纵火案二审:莫焕晶称因摔倒未能用水桶灭火 美国运营商年底推出5G固网业务 全球展开5G商用竞赛 韩方回应老挝溃坝:尚无韩侨民伤亡 已展开救援 富士康“插队”IPO A股BATJ梦圆进行时 福建团开放日:“自贸”“对台”成高频词 马化腾:国产原创游戏越来越多 中国IP不输好莱坞 乌克兰完成加入北约关键一步:获北约“申请国”身份 中兴通讯:延期披露2018年第一季度财报 股票继续停牌 罗马赛莎娃奥斯塔彭科会师八强 大威惨遭淘汰 360安全大脑:数聚AI构筑未来安全生态
澳大利亚总理期待年内访华?反对党:我们先来 长春草根超巨:遗憾两次错过足金 新浪让足球人圆梦 海南建省办特区入而立之年 未来如何深化改革开放 美军再曝女兵艳照丑闻 数百不雅照片被上传网络共享 “飞机起飞前男人跪下”长文刷屏 网友:漏洞太多 柯洁&李世石 与AlphaGo交手的他们将在古堰画乡相… 张玉宁德甲遭弃用!主帅:想赢比赛 所以不用他 百灵杯业余组伊利亚站立思索 最终遗憾止步八强 嘉楠耘智已赴港递交招股书,有望成比特币矿机第一股 中日八年首度重启经济高层对话 将维护多边贸易体制 人和客战建业海报:三箭齐发及锋而试 盼带回三分 英媒曝马夏尔被曼联罚两周薪水 迟迟未归惹怒穆帅
孔蒂:批评者太蠢!傻子才和曼城对攻 请看阿森纳 美联储理事布雷纳德:经济“逆风正在转为顺风” 独家|专访景驰CEO韩旭:限制我们速度的只有光速 美日印军方开会竟花一小时吐槽中国 妄称中国搞破坏 警惕互联网上的消费陷阱 青岛市政府侨办形式官僚主义严重 党组书记被免职 分析机构:智能手表今年将腾飞 出货量或达7100万部 中国大陆即将选拔第三批太空人 台媒:台青年可圆梦 特朗普计划对进口钢铝征关税 这是可能的赢家和输家 湖南湘阴反贪局长为涉案者出主意对抗审查 被撤职 台民众喊话蔡英文:两岸越早统一 对台湾越有利 广厦大外援失踪或将被更换?浙媒:信口开河! 比特币跌破7000美元 美国相关板块重挫 亚游wwwag8com