一.快速排序简介
1、先从数列中取出一个数作为基准数。
2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3、再对左右区间重复第二步,直到各区间只有一个数。
4.、时间复杂度:O(nlogn)
5、空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
6、稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
二.动图演示
三.代码实现
public class Cc {
private static int count;
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
int[] num = {3, 45, 78, 64, 52, 11, 64, 55, 99, 11, 18};
System.out.println(arrayToString(num, "未排序"));
QuickSort(num, 0, num.length - 1);
System.out.println(arrayToString(num, "排序"));
System.out.println("数组个数:" + num.length);
System.out.println("循环次数:" + count);
}
/**
* 快速排序
*
* @param num 排序的数组
* @param left 数组的前针
* @param right 数组后针
*/
private static void QuickSort(int[] num, int left, int right) {
//如果left等于right,即数组只有一个元素,直接返回
if (left >= right) {
return;
}
//设置最左边的元素为基准值
int key = num[left];
//数组中比key小的放在左边,比key大的放在右边,key值下标为i
int i = left;
int j = right;
while (i < j) {
//j向左移,直到遇到比key小的值
while (num[j] >= key && i < j) {
j--;
}
//i向右移,直到遇到比key大的值
while (num[i] <= key && i < j) {
i++;
}
//i和j指向的元素交换
if (i < j) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
num[left] = num[i];
num[i] = key;
count++;
QuickSort(num, left, i - 1);
QuickSort(num, i + 1, right);
}
/**
* 将一个int类型数组转化为字符串
*
* @param arr
* @param flag
* @return
*/
private static String arrayToString(int[] arr, String flag) {
String str = "数组为(" + flag + "):";
for (int a : arr) {
str += a + "\t";
}
return str;
}
}