快速排序的基本思路:
选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,直到整个序列达到有序。
整个快排的过程就ke简化可以一趟排序的过程,然后递归调用就行了。(注:递归过程一定要有出口,即递归结束条件)
一趟排序的方法:
1,定义i=0(low),j=A.lenght-1(high),i为第一个数的下标,j为最后一个数下标。定一个枢轴key(key是任意选取的,这里我的key选的是第一个数,即下图的 6)
2,从数组的最后一个数Aj 从右往左找,找到第一小于key的数 (5),记为Aj ;
3,从数组的第一个数Ai 从左往右找,找到第一个大于key的数(7),记为Ai;
:
4,交换Ai 和Aj (7和5)
5,重复这个过程,直到 i=j
6,调整key的位置,把A[i] 和key交换
代码实现:
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] a = { 1, 2, 4, 5, 7, 4, 5, 3, 9, 0 };
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 low, int high) {
// 递归出口
if (low > high) {
return;
}
//标记
int i = low;
int j = high;
int key = a[low];
// 完成一趟快排
while (i < j) {
// 1.从右往左找到第一个小于key的数
while (i < j && a[j] >key) {
j--;
}
// 2. 从左往右找到第一个大于key的数
//(刚开始少了等于,发现run了好久都没run出来,可能陷入了死循环)
while (i < j && a[i] <= key) {
i++;
}
// 3. 交换
if (i < j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
// 4.调整key的位置 (将key放到i的位置)
a[low] = a[i];
a[i] = key;
// 递归过程
// 5. 对key左边的数快排
quickSort(a, low, i - 1);
// 6. 对key右边的数快排
quickSort(a, i + 1, high);
}
}