快排就是先找一个数为基准,把所有比这个数大的放在基准的右边,比这个数小的放在左边,这样基准的位置定下了;然后再对基准两边的数进行相同的操作
hdu 1040 As Easy As A+B
import java.io.BufferedInputStream; import java.util.Scanner; import static java.lang.System.out; public class Main { private Scanner sc = new Scanner(new BufferedInputStream(System.in)); private int[] a; public void init() { int nCase = sc.nextInt(); while (nCase-- > 0) { int n = sc.nextInt(); a = new int[n]; for (int i = 0; i < n; i++) a[i] = sc.nextInt(); quickSort(0, a.length - 1); for (int i = 0; i < n-1; i++) out.printf("%d ", a[i]); out.println(a[n-1]); } } private void quickSort(int left, int right) { if (left < right) { int j = partition(left, right); quickSort(left, j - 1); quickSort(j + 1, right); } } private int partition(int first, int end) { int p = a[first], i = first, j = end;//以第一个数为基准 p while (i < j) { // 从右向左找 while (i < j && a[j] > p) j--; if (i < j) { a[i] = a[j]; i++; } // 从左向右找 while (i < j && a[i] < p) i++; if (i < j) { a[j] = a[i]; j--; } //以上两个过程实质就是交换比p大和比p小的两个元素位置 } a[i] = p;//最终i、j的位置的就是基准的位置 return i;//返回基准的位置 } public static void main(String[] args) { new Main().init(); } }