快速排序相当于冒泡排序的进化版本,优点是速度比冒泡排序更快,缺点是写起来逻辑比冒泡排序啰嗦一点,没那么直观。
快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候 设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全 部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进 行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当 然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和 冒泡排序是一样的,都是 O(N2),它的平均时间复杂度为 O (NlogN)
下图是对:6 1 2 7 9 3 4 5 10 8进行快速排序的描述图
题目:
输入一串没有顺序的数字,对这串数字进行升序排序,并输出
package _4_9_test;
import java.util.ArrayList;
import java.util.Scanner;
/*快速排序法
*
* */
public class EightyEight {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int num[] = new int[n];
for (int i = 0; i < n; i++) {
num[i] = scanner.nextInt();
}
quitSort(num, 0, n - 1);
for (int i : num) {
System.out.print(i + " ");
}
}
public static void quitSort(int num[], int getLeft, int getRight) {
int left, right, t;
// 左右起始的位置
left = getLeft;
right = getRight;
// 如果左右的位置发生了交错,说明当前序列的循环结束了
if (left > right) {
return;
}
// 用于存放基准位
int temp;
// 选择序列的第一个数作为基准位
temp = num[left];
// 当左右位置还没碰面时
while (left < right) {
// 从序列的右边往左走,如果数字大于基准位,则继续走,直到碰到小于基准位的数字
while (left < right && temp <= num[right]) {
right--;
}
// 从序列的左边往右走,如果数字小于基准位,则继续走,直到碰到大于基准位的数字
while (left < right && temp >= num[left]) {
left++;
}
// 将左边大于基准位的数和右边小于基准位的数进行位置互换
t = num[right];
num[right] = num[left];
num[left] = t;
}
if (left >= right) {
// 序列中数字位置对调结束后,将基准位归位
num[getLeft] = num[left];
num[left] = temp;
}
// 递归
// 对基准位左边的序列重复执行上面的步骤
quitSort(num, getLeft, left - 1);
// 对基准位右边的序列重复执行上面的步骤
quitSort(num, left + 1, getRight);
}
}