步骤
1. 在数组中选一个基准数(通常为数组第一个);
2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;
3. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。
代码
public class test {
public static void main(String[] args) {
int[] nums = {3,2,1,5,6,4};
qsort(nums,0,nums.length-1);
for(Integer integer:nums)
System.out.print(integer);
}
public static void qsort(int[] nums,int begin,int end){
if(begin<end){
int temp = nums[begin];
int i = begin;
int j = end;
while(i<j){
while (i<j&&nums[j]>=temp)
j--;
nums[i] = nums[j];
while (i<j&&nums[i]<=temp)
i++;
nums[j] = nums[i];
}
nums[i] = temp;
qsort(nums,begin,i-1);
qsort(nums,i+1,end);
}
else
return;
}
基线条件:begin==end,也就是说数组仅一个元素时完成排序。
递归条件:begin!=end,待排数组至少还有两个元素,还需要递归完成排序。
temp作为基准值,将整个数组一分为二,左区域用i进行遍历,右区域用j进行遍历,先遍历右区域,遇到大于基准值,略过,遇到小于基准值,跳出循环,与索引i处的值互换,再遍历左区域,遇到小于基准值,略过,遇到大于基准值,跳出循环,与索引j处的值互换。反复横跳,保证换到索引i处的值小于基准值,换到索引j处的值大于基准值,当i和j相遇时跳出大循环,此时i和j相遇处既是基准值的位置,将基准值放在此处,再接着递归遍历基准值左右两边的区域。