1.找到i和j,要比较的范围,找到基准数
2.先从j开始,找到第1个比基准数小的元素,停止,找的过程要保持i<j
3.再从i开始,找到第1个比基准数大的元素,停止,找的过程要保持i<j
4.如果i < j,交换两个元素
5.如果i != j ,重复2,3,4步
6.交换位置i上的元素和基准数
7.再按上述算法分别处理左右两边的小数组
Sort.java
public class Sort
{
private int[] arr;
public Sort(int[] arr)
{
this.arr = arr;
}
public void qsort(int left,int right)
{
if(left>right)
{
return;
}
int i=left; //防止left在循环中改变,所以保存到i中
int j=right;
int x=arr[left];//选择最左边作为基准数
while(i!=j)
{
while (arr[j] >= x && i < j) //先从j开始,找第一个比基准数小的
{
j--;
}
while (arr[i] <= x && i < j)//先从j开始,找第一个比基准数大的
{
i++;
}
if (i < j)
{
int t = arr[i]; //交换值
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left]=arr[i];//交换位置i上的元素和基准数
arr[i]=x;
qsort(left, i - 1);//递归处理左右两边的小数
qsort(i + 1, right);
}
}
SortTest.java
import java.util.Arrays;
public class SortTest
{
public static void main(String[] args)
{
int[] arr=new int[]{5,4,6,2,3,1,8,7,9};
Sort s =new Sort(arr);
s.qsort(0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}