简介
快速排序是冒泡排序的一种改进。开发中,快速排序用的非常多。
- 选择排序的思想也非常简单
- 通过一趟排序将要排序的数据分割成独立的两部分,其中前一部分的所有数据都比另外后一部分的所有数据都要小。
- 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
核心代码
public class QuickSort {
public void quick(int [] a){
if (a.length > 0) {
quickSort(a, 0, a.length-1);
}
}
/**
* 快速排序
* @param a
* @param i
* @param j
*/
private void quickSort(int[] a, int low, int high) {
if (low < high) {
int middle = getMiddle(a, low, high);
quickSort(a, 0, middle-1);
quickSort(a, middle + 1, high);
}
}
/**
* 获取中间下标
* @param a
* @param low
* @param high
* @return
*/
private int getMiddle(int[] a, int low, int high) {
int temp = a[low]; // 基准元素
while (low < high) {
while (low < high && a[high] >= temp) {
high--;
}
a[low] = a[high];
while (low < high && a[low] <= temp) {
low++;
}
a[high] = a[low];
}
a[low] = temp; // 插入到排序后正确的位置
return low;
}
public static void main(String[] args){
QuickSort quickSort = new QuickSort();
int [] a = {19, 2, 3, 90, 67, 33, -7, 24, 3, 56, 34, 5};
quickSort.quick(a);
for (int num :a) {
System.out.println(" " + num);
}
}
}
quickSort()
函数内采取先序方式进行递归。
- 第一次调用
getMiddle()
将数组分成两部分,前一部分的任何值都比后一部分的任何之小。 - 然后递归这前一部分,再递归后一部分。
- 这样一变二,二变四,四变八。。。每一部分都进行排序。
- 回归时,就成了一个有序的序列。
- 第一次调用
优缺点
优点
- 快,数据移动少
- 开发使用多
- 在平均情况下是的排序算法中时间常数最小的,但是最坏情况下会退化到
O(n^2)
缺点
- 不稳定
复杂度
时间复杂度
O(n*logn)
空间复杂度
O(1)
- 最优的情况下空间复杂度为:
O(logn)
,每一次都平分数组的情况 - 最差的情况下空间复杂度为:
O( n )
,退化为冒泡排序的情况
稳定度
- 不稳定
应用场景
当数量在50以内
- 可以使用插入或选择
当数量比较大
- 可以使用快速排序、堆排序和归并排序。