java排序(快速排序)

作者: z七夜 | 来源:发表于2018-05-24 20:22 被阅读16次

    快速排序

    思路

    • 在数组中寻一中间数,将比中间数小的放在左边,将比中间数大的放在右边
      从左边开始找,找到比中间数大的,记住,从右边开始找,找到比中间数小的,然后交换两边
      然后在左边再寻一中间数,同坐上面的事,右边也一样,然后循环

    实现

    数组:[2,6,3,6,5,9,1]
    输出:[1 2 3 5 6 6 9 ]

    private static void paixu(int[] arrs, int h, int e) {
            int head =h;
            int end = e;
    
            int x=(h+e)/2;//中间值的位置
    
            while (h <= e){//两个指针还没有遇到
    
                while (arrs[x]>arrs[h]){//从左边开始找,找到比中间值大的数
                    h++;
                }
    
                while (arrs[x]< arrs[e]){//从右边开始查找,找到比中间值小的
                    e--;
                }
                //交换值
                int m;
                m = arrs[h];
                arrs[h] = arrs[e];
                arrs[e] = m;        //2,6,3,6,5,9,1
                h++;                //2,1,3,6,5,9,6
                e--;                //2,1,3,5,6,9,6
    
            }
            //递归查询左右两边
            if (head < e){
            paixu(arrs,head,e);}
            if (end > h){
            paixu(arrs,h,end);}
        }
    

    为什么会有h++,e--呢
    跟一下代码
    输入数组[2,6,3,6,5,9,1]
    第一次运行
    中间位置是3,值是6
    左边是0,右边是6

    往下执行

    h=1,e=6
    数组变成[2,1,3,6,5,9,6]

    执行加减操作 h=2,e=5;然后开启第二轮的执行

    假如不进行加减操作,
    继续执行的话,左边继续判断,当查询到6的时候停止,
    右边查询,查询到6的时候停止,然后交换,6和6交换,然后再次开启循环,就会死循环,

    当执行加减操作之后,再次判断的时候,就会从交换数据之后的索引开始判断,就不会再次判断了,

    相关文章

      网友评论

        本文标题:java排序(快速排序)

        本文链接:https://www.haomeiwen.com/subject/cucejftx.html