快速排序的思路:
首先定主元,一般设置为数组起始位置。然后定义两个指针,一个是左指针l,指向主元,一个右指针r,指向数组最后一个元素
先从r开始向前扫描,找到第一个比主元小的元素,然后从l开始向后扫描,找到第一个比主元的大的元素,此时交换left和right位置的元素。直到两个指针交叉之后,结束循环。
循环结束之后,l指向的位置就是最后一个小于等于主元的位置,也就是主元应该待的位置. 将主元放在正确的位置。此时就一轮快排结束,主元左侧的元素都小于主元,主元右侧的元素都大于主元。l
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {0,-10,5,9,7,6,4,6,8};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int left,int right)
{
if(left>right)
{
return;
}
int l = left;
int r = right;
int pivot = arr[left]; //基准值
int temp = 0; //用来交换
while(l < r)
{
//从右边开始找第一个比基准值小的值 a ,否则的话r--
while(arr[r] >=pivot && l <r)
{
r--;
}
//从左边开始找第一个比基准值大的值 b,否则的话l++
while(arr[l] <=pivot && l <r )
{
l++;
}
//交换 a和b
if(l < r)
{
temp= arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
//当退出循环之后,说明找到了基准值应该放的位置,将基准值放在正确的位置
arr[left] = arr[l];
arr[l] = pivot;
//递归基准值左边的
quickSort(arr,left,l-1);
//递归基准值右边的
quickSort(arr,l+1,right);
}
}