首页 > 编程知识 正文

快速排序第二趟怎么做,算法快速排序

时间:2023-05-04 00:04:06 阅读:31664 作者:2410

排序思维快速排序是一种交换排序,一般情况下排序时间复杂度为o(nlogn ),最坏情况(数组已有序情况),排序时间复杂度为o (n ^2)

快速排序的想法是按排序确定基准值的位置,使该值的左边的值小于它,右边的值大于它,对左右两个子数组进行快速排序的递归调用,直到所有数字都放置在对应的位置并排序结束为止

因此,快速排序中最重要的操作是partition ()方法的实现。 )确定基准值的位置,使该值左边的值小于该值,右边的值大于该值。 )

最常用的分区方法是挖洞法

将数组最左侧的元素定义为基础值pivot,并设置指向数组最左侧元素和最右侧元素的两个指针(哨兵) low。 此时,如果从数组中取出pivot,则空出nums[low]的位置形成孔,等待数据进入; 首先将指针high向左移动。 (high),每次移动时,检查指针high指向的元素是否小于pivot公称值,如果不小则移动,如果小则放入指针low指向的孔中。 此时,指针high指向的位置空出,形成新的孔,等待数据的插入。 (仔细想想,这样做的目的是将所有小于pivot的元素放在pivot最终位置的左侧)然后向右移动指针low。 与上述步骤相同,每次移动时检查指针low指向的元素是否大于pivot,如果不大于,则移动指针,如果大于,则放入指针high指向的孔中。 此时,指针low指向的位置还会出现空孔。 (同样,这是为了将大于pivot的要素配置在pivot的最终位置的右侧)重复上述3、4的步骤,在指针low、high相遇之后指针low、high指向相同的要素,并且在该要素中一定要保存数据

在代码实现代码中我实现了两种不同的partition ()方法。 第一个是挖洞法,第二个是感兴趣的话请看。 其实只是调整了交换要素的操作位置

公共语音快速排序(int [ ] nums,int low,int high ) if ) lowhigh ) intpivot=partition ) nums,low,high; 调用partition获取pivot的最终位置,使//pivot的左侧值全部小于它,右侧值全部大于快速排序(nums,low,pivot-1 ); //递归左侧子序列quicksort(nums,pivot 1,high ); //右边的子序列A(//挖洞方法publicintpartition(int[]nums,int low,int high ) { int pivot=nums[low]; while(lowhigh ) ) while lowhighnums [ high ]=pivot ) high--; nums[low]=nums[high]; while(lowhighnums[low]=pivot ) low; nums[high]=nums[low]; } nums[low]=pivot; 返回低; }公共int分区1 (int [ ] nums,int low,int high ) int low; int pivot=nums[low]; while(lowhigh ) ) while lowhighnums [ high ]=pivot ) high--; while(lowhighnums[low]=pivot ) low; swap(nums,low,high ); }swap(nums,k,low ); 返回低; }publicvoidswap(int[]nums,int i,int j ) { int temp=nums[i]; nums[i]=nums[j]; nums[j]=temp; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。