流程:
- 选定一个分界值,根据该分界值将数据分为左右两部分。
- 将大于该值的数据放到右边,小于或等于该值的数据放到左边。(这样该值的左边部分的数据一定小于或等于该值,右边部分一定大于该值。也就是说选定的分界值已经处于最终排序的位置了。)
- 然后将选定分界值的左边部分和右边部分重复上诉步骤。
Java代码
交换法(每次扫描到符合要求的数据,直接与分界值交换位置):
public class QuickSort {
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) return;
int key = arr[left];
int i = left;
int j = right;
while (i != j) {
while (i < j && arr[j] >= key) {
j--;
}
swap(arr, i, j);
while (i < j && arr[i] < key) {
i++;
}
swap(arr, i, j);
}
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
public static void swap(int[] arr, int src, int des) {
int temp = arr[src];
arr[src] = arr[des];
arr[des] = temp;
}
}
填坑法(将选定的分界值当作坑位,每次扫描到符合要求的数据项,直接往坑里填,然后该数据项位置为新坑位,最后将分界值填到属于它的位置):
public class QuickSort {
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) return;
int key = arr[left];
int i = left;
int j = right;
while (i != j) {
while (i < j && arr[j] > key) {
j--;
}
if(i < j) {
arr[i] = arr[j];
i++;
}
while(i <j && arr[i] <= key) {
i++;
}
if(i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = key;
quickSort(arr, left,i -1);
quickSort(arr, i + 1, right);
}
}