首页 > 其他分享 >双边快排的基准点和先判断left还是right问题

双边快排的基准点和先判断left还是right问题

时间:2023-09-15 10:23:07浏览次数:32  
标签:endIndex 基准点 right int arr 快排 startIndex left

  前同事问了我一个双边快排的算法,他问我怎么都无法正常排序,代码如下,

public static void main(String[] args) {
        int[] arr = new int[]{7,3,6,4,8,9,0,22,28,2,3,79,24};
        arr = new int[]{4,4,6,5,3,2,8,1};

        System.out.println("left:"+0+"  right:"+(arr.length-1)+ " " +Arrays.toString(arr));

        TestJDBC testJDBC = new TestJDBC();
        testJDBC.quickSort(arr,0,arr.length-1);

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

    public void quickSort(int[] arr,int startIndex,int endIndex){
        if(startIndex>=endIndex) return ;

        int pivotIndex = partation(arr,startIndex,endIndex);
        quickSort(arr,startIndex,pivotIndex-1);
        quickSort(arr,pivotIndex+1,endIndex);
    }

    public int partation(int[] arr ,int startIndex,int endIndex){
        int pivot = arr[startIndex];
        int left = startIndex;
        int right = endIndex;


        while(left!=right){

            while(left<right&&arr[left]<=pivot){
                left++;
            }

            while(left<right&&arr[right]>pivot){
                right--;
            }
//            while(left<right&&arr[left]<=pivot){
//                left++;
//            }
            if(left<right){
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }

            System.out.println("left:"+left+"  right:"+right+ " " +Arrays.toString(arr));

        }

        arr[startIndex] = arr[left];
        arr[left] = pivot;

        return left;
    }

  上述快排的输出结果如下,

   从上面结果可以看出,在  left:5  right:5 [4, 4, 1, 2, 3, 5, 8, 6]  这里开始出问题了,

  如下图所示,当left和right在3,5时,先运算的left,导致left直接到right那了,然后进行交换4和5交换,

   所以左边待排序数组变为  5, 4, 1, 2, 3   右边待排序数组变为 8, 6 。

 

 

  错误的原因就在于先左边还是先右边顺序的问题,修改后代码如下,输出如下图,

      基准点选择了左边,从右边先开始即可,

//            while(left<right&&arr[left]<=pivot){
//                left++;
//            }

while(left<right&&arr[right]>pivot){
    right--;
}
while(left<right&&arr[left]<=pivot){
    left++;
}

  基准点是从左边选的,而left <= pivot,所以left先判断肯定left第一次是满足条件,这样有可能就直接让left==right了。

 

标签:endIndex,基准点,right,int,arr,快排,startIndex,left
From: https://www.cnblogs.com/weiyanei/p/17704249.html

相关文章

  • 对于数组中取下标中值操作int mid=(left+right)/2的讨论
    分两种情况1.left和right之间(含left和right元素)共有奇数个,此时中轴线穿过正中间的元素判断方法:right-left的值为偶数,即(right-left)%2=0。此时(left+right)/2恰为整数,此结果恰为left与right下标之间的中值下标,正好在中轴线上2.left......
  • 中值计算为什么一般用left+(right-left)/2而不是(right+left)/2
    left+(right-left)/2和(right+left)/2两个计算的结果是一样的,但是1、对于16位编译器,int占16位(2字节)。int的最大值为32767.2、对于32位和64位编译器,int占32位(4字节)。int的最大值为2147483647使用(right+left)/2当right+left的值超过int的最大值的时候就会溢出而轮不到/......
  • Playwright轻松保存抓取的内容,快速整理数据
    作为一名爱好编程的程序员,你是否曾经遇到过需要抓取网页上的数据却无从下手的情况?Playwright是一款优秀的自动化测试工具,可以帮助你轻松地抓取网页上的内容,并且还可以将抓取到的数据进行保存。本文将详细介绍如何使用Playwright保存抓取的内容,希望对大家有所帮助。一、安装Playwr......
  • playwright-python等待请求响应
    使用playwright打开一个页面时,要等待某一接口的响应。在看官网提供的node.js的文档时很容易的找到了//Startwaitingforresponsebeforeclicking.Notenoawait.constresponsePromise=page.waitForResponse('https://example.com/resource');awaitpage.getByText('tr......
  • A RenderFlex overflowed by 483 pixels on the right.
    ARenderFlexoverflowedby483pixelsontheright.Flutter出现List<dynamic>isnotasubtypeoftypeList<String>解决方法_flutterlist<dynamic>_codekxx的博客-CSDN博客https://blog.csdn.net/codekxx/article/details/104557944 翻译搜索复制......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外
    1.简介通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。2.iframe定位2.1动态id属性如何定位有时候,我们可能看到的iframe的id不是固定的,是动......
  • 快排及链表排序
    文章目录一、普通的快排二、链表的创建三、链表的冒泡排序四、链表快排五、链表归并排序一、普通的快排voidQuickSort(vector<int>&vec,intlow,inthigh){ intpivot=vec[low];//选择第一个元素作为枢纽元 //mid总是指向最后一个比枢纽元小的位置,当需要交换元素时,先......
  • python+playwright 学习-80 v1.37版本新增--full-page-screenshot 用例失败截长图
    前言--full-page-screenshot参数是pytest-playwright在使用,在失败时是否进行完整页面截图。默认情况下,仅捕获视口。需开启--screenshot开关(默认:off).用例失败截图环境准备:1.安装playwright最新v1.37版本2.安装pytest-playwright0.4.2版本用例示例fromplaywright.......
  • python+playwright 学习-79 设置全局导航超时和全局查找元素超时
    前言playwright默认全局的导航时间是30秒,查找元素超时也是30秒,有以下几个方法设置全局超时时间:browser_context.set_default_navigation_timeout()browser_context.set_default_timeout()page.set_default_navigation_timeout()page.set_default_timeout()导航超时设置......
  • python+playwright 学习-78 获取浏览器cookies
    前言playwright操作浏览器上的页面后,后续如果想结合其他的框架操作接口(如:requests),可以直接获取到浏览器的cookies。context.cookies()获取浏览器cookies使用示例fromplaywright.sync_apiimportsync_playwright,expectwithsync_playwright()asp:browser=......