快速排序单边循环

Posted 程序技术分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序单边循环相关的知识,希望对你有一定的参考价值。


快速排序-单边循环



01

引入单边循环

      上次已经介绍了快速排序的双边循环,今天简单的叙述一下,单边循环。

        无论是双边循环,还是单边循环,解决思路是一样的,都是选取基准数,让大于基准数的在一边,小于基准数的在另一边。重复递归执行,最终达到有序性。


02

如何做单边循环

        

        选定一个基准数(一般方便选取最开始或者结束的位置),定义两个变量,left ,current。current定义当前位置的指针,left标记小于的区域边界,

        做法是遍历数据,做到当前位置数据大于基准数据时位置不变,current+1;当前位置小于基准数据时候,当前位置和left指针的下一个位置交换数据,left和current指针分别向右移动一位。


        第一步:left和current。都指向第一个位置。选取的基准数也为第一个位置的数3.


快速排序(2)单边循环

        第二步:基准数与current比较,3=3;不交换位置。current向右移动到5位置,left不变。

快速排序(2)单边循环

        第三步:current=5>基准数,不交换位置,current向右移动一位,到1的位置。1<基准数,和left+1位置数 5交换数据,left指针向右移动,包裹住1,扩大小于基准数的区域,current指针向后移动。

快速排序(2)单边循环

        第四步: current=2 <3,当前位置与left指针下一个数据交换,2与5交换位置,并且left指针和current指针向后移动

快速排序(2)单边循环

    第五步:current为3=3,位置不变,left不变,current向后移动。

快速排序(2)单边循环

    第六步同上

快速排序(2)单边循环

    第七步同上

快速排序(2)单边循环

循环结束,交换left指针位置的数和基准数交换。此时left左边的数都是小于基准数的,left右边的数是大于等于基准数的,一次循环确定了基准数的位置不在变化,下面在分别对两个区域的数进行递归调用,确定每个区域每个数的位置,此时数据就是有序的。快速排序(2)单边循环



03

代码实现

public class QuickSortSing { public static void main(String[] args) { int[] arr_sort = new int[]{3,5,1,2,3,9,4};
if(arr_sort.length<2 || arr_sort==null){ return ; } sort(arr_sort,0, arr_sort.length-1); for (int val : arr_sort) { System.out.println(val); } }
public static void sort(int[] arr ,int l,int r){ if(l<r){             int p = patision(arr,l,r); //获取小于的值边界 sort(arr,l,p-1); sort(arr,p+1,r); } } /** * @param arr 待排序数组 * @param start 开始坐标 * @param end 结束坐标 * @return 小于的边界 */ public static int patision(int[] arr,int start, int end){ //选取范围内的第一个作为基准数 int provit = arr[start]; int left = start; //小于区域的边界 for (int i=start;i<=end;i++){ if(arr[i]<provit){ //交换位置 swap(arr,i,++left); }
} //最后交换第一个数和最小值的边界位置 swap(arr,start,left); return left; }
public static void swap(int[] arr, int index, int i) { int temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; }}




  


快速排序(2)单边循环
END
快速排序(2)单边循环





快速排序(2)单边循环
长按扫码关注








以上是关于快速排序单边循环的主要内容,如果未能解决你的问题,请参考以下文章

算法常识——快速排序

快速排序-递归实现

高速排序--双边扫描与单边扫描的实现

Java快速排序的非递归实现

快速排序while循环先执行high--的原因

Debian9 快速开启 TCP BBR 实现高效单边加速