快排简介
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。
快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
快排 在实际中最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。
什么是快速排序?
快排的基本思想:快排采用的是分治(PS:分开治理)的思想。
过程是这样的:1、在一组数中找到一个基准值(key)
2、把这一组数分为小于key的一小组数,和大于key的另一小组数(按升序排列)
把小于key的一小组数放在key的左边 ,大于key的另一小组数放在key的右边
3、重复 1、 2步骤,直到各区间只有一个数。
选择关键字 key (基准)的方式:
选择待排序序列的哪个元素为基准是非常重要的,因为基准关系到分割后两个子序列的长度。对于分治算法,当每次划分时,算法若都能分成两个等长的子序列时,那么分治算法效率会达到最大。总之,基准对整个算法的效率有着决定性影响。
图解思路
代码如下:
private static void quickSort(int[] arr, int l, int r) {
if (l>r) {
return;
}
int key = arr[l];
int left = l;
int right = r;
while(left<right){
while (right>left && arr[right] >= key){
right--;
}
while(left<right && arr[left] <= key){
left++;
}
if (right>left){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
arr[l] = arr[left];
arr[left] = key;
quickSort(arr,l,left-1);
quickSort(arr,left+1,r);
}