快速排序基于分治的思想,该方法的基本思路是:
- 先从数列中取出一个数作为基准数。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
一趟快速排序的算法是:
- 设置两个变量 i、j,排序开始的时候:i=0,j=N-1
- 以第一个数组元素作为关键数据 key
- 从 j 开始向前搜索,找到第一个小于 key 的值与 key 交换
- 从 i 开始向后搜索,找到第一个大于 key 的值与 key 交换
- 重复第3、4步,直到 i=j,将对应的值与 key 交换
这个过程还可以优化:j 向前扫描时遇到比 key 小的值暂不交换,停止扫描并使 i 开始向后扫描,等到 i 对应的值大于 key 时,直接交换 i 和 j 对应的值,然后继续扫描直到 i、j 相遇,扫描和交换的过程结束。这时 i 左边的值都小于基准值,右边的值都不小于基准值,即 key 回到正确的位置。然后就可以分别对这两部分进行快速排序。
java代码如下:
public class QuickSort {
private final static int MAX_NUM = 10;
public static void main(String args[]) {
int[] array = new int[MAX_NUM];
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
for (int i : array) {
System.out.print(i + " ");
}
System.out.println();
int low = 0;
int high = array.length - 1;
QuickSort tQS = new QuickSort();
tQS.quickSort(array, low, high);
for (int i : array) {
System.out.print(i + " ");
}
}
void quickSort(int[] array, int low, int high) {
int i = low;
int j = high;
int key = array[low];
while (i < j) {
while (array[j] >= key && i < j) {
j--;
}
while (array[i] <= key && i < j) {
i++;
}
if (i < j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
array[low] = array[i];
array[i] = key;
if (i > low) {
quickSort(array, low, i - 1);
}
if (j < high) {
quickSort(array, i + 1, high);
}
}
}
快速排序的平均时间复杂度为O(nlgn),最坏情况时间可达到O(n^2):当要排序的数据基本有序的时候。我们知道,当把数列平均分成两个等长的数列时效率最高,两部分相差越大效率越低。
为降低最坏情况出现的几率,我们可以采用一种优化的算法 随机快速排序