@java快速排序
快排原理:
在要排的数(比如数组A)中选择一个基准值(比如A[0]),通过一趟排序将数组A分成两部分,其中以基准值为中心,基准值右边都比基准值大,基准值左边的都基准值小,然后对这两部分分别重复这个过程(递归),直到整个有序。
方法:
1.定义i=0,j=a.length()-1。定义基准值temp=a[0]。i为第一个数的下标,j为最后一个数的下标;
2. 从最后一个数(a[j])向左查找,找到小于基准值的数时停止,此时j为该数的下标;
3. 从第一个数(a[i])向右查找,找到大于基准值的数时停止,此时i为该数的下标;
4. 交换a[i]和a[j];
5. 重复2-4步,直到i=j;
6. 交换基准值和a[i];
7. 此时以基准值的数值分成两部分,左边小于基准值,右边大于基准值;然后对这两部分继续排序
package Sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] a = {6,2,3,1,5,8,4,0,9,7};
System.out.println(Arrays.toString(a));
quickSort(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}
public static void quickSort(int []a,int left, int right) {
//递归结束条件
if(left > right)
return;
int i = left;
int j = right;
int temp = a[i];//基准值
//完成一趟排序
while (i < j) {
//从右向左找到第一个小于temp的数
while (temp < a[j] && i < j)
j--;
//从左向右找到第一个大于temp 的数
while (temp >= a[i] && i < j)
i++;
//交换a[i] 和 a[j]
if (i < j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//调整temp 的位置
int t = a[i];
a[i] = a[left];
a[left] = t;
//对temp 的左边进行快速排序
quickSort(a,left, i - 1);
//对temp 的右边进行快速排序
quickSort(a,i + 1, right);
}
}