快速排序单边循环
Posted 程序技术分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序单边循环相关的知识,希望对你有一定的参考价值。
01
引入单边循环
上次已经介绍了快速排序的双边循环,今天简单的叙述一下,单边循环。
无论是双边循环,还是单边循环,解决思路是一样的,都是选取基准数,让大于基准数的在一边,小于基准数的在另一边。重复递归执行,最终达到有序性。
02
如何做单边循环
选定一个基准数(一般方便选取最开始或者结束的位置),定义两个变量,left ,current。current定义当前位置的指针,left标记小于的区域边界,
做法是遍历数据,做到当前位置数据大于基准数据时位置不变,current+1;当前位置小于基准数据时候,当前位置和left指针的下一个位置交换数据,left和current指针分别向右移动一位。
第一步:left和current。都指向第一个位置。选取的基准数也为第一个位置的数3.
第二步:基准数与current比较,3=3;不交换位置。current向右移动到5位置,left不变。
第三步:current=5>基准数,不交换位置,current向右移动一位,到1的位置。1<基准数,和left+1位置数 5交换数据,left指针向右移动,包裹住1,扩大小于基准数的区域,current指针向后移动。
第四步: current=2 <3,当前位置与left指针下一个数据交换,2与5交换位置,并且left指针和current指针向后移动
第五步:current为3=3,位置不变,left不变,current向后移动。
第六步同上
第七步同上
循环结束,交换left指针位置的数和基准数交换。此时left左边的数都是小于基准数的,left右边的数是大于等于基准数的,一次循环确定了基准数的位置不在变化,下面在分别对两个区域的数进行递归调用,确定每个区域每个数的位置,此时数据就是有序的。
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;
}
}
以上是关于快速排序单边循环的主要内容,如果未能解决你的问题,请参考以下文章