标签:
在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序。
本文就来说说交换排序的最后一拍:快速排序算法。之所以说它是快速的原因,不是因为它比其他的排序算法都要快。而是从实践中证明了快速排序在平均性能上的确是比其他算法要快一些,不然快速一说岂不是在乱说?
本文就其原理、过程及实现几个方面讲解一下快速排序算法。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Coding-Naga
发表日期:2016年3月1日
链接:http://blog.csdn.net/lemon_tree12138/article/details/50622744
来源:CSDN
更多内容:分类 >> 算法与数学
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
/*
* 排序的核心算法
*
* @param array
* 待排序数组
* @param startIndex
* 开始位置
* @param endIndex
* 结束位置
*/
private void sortCore(int[] array, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return;
}
int boundary = boundary(array, startIndex, endIndex);
sortCore(array, startIndex, boundary - 1);
sortCore(array, boundary + 1, endIndex);
}
/*
* 交换并返回分界点
*
* @param array
* 待排序数组
* @param startIndex
* 开始位置
* @param endIndex
* 结束位置
* @return
* 分界点
*/
private int boundary(int[] array, int startIndex, int endIndex) {
int standard = array[startIndex]; // 定义标准
int leftIndex = startIndex; // 左指针
int rightIndex = endIndex; // 右指针
while(leftIndex < rightIndex) {
while(leftIndex < rightIndex && array[rightIndex] >= standard) {
rightIndex--;
}
array[leftIndex] = array[rightIndex];
while(leftIndex < rightIndex && array[leftIndex] <= standard) {
leftIndex++;
}
array[rightIndex] = array[leftIndex];
}
array[leftIndex] = standard;
return leftIndex;
}
排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | ||
平均情况 | 最坏情况 | 最好情况 | ||||
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(log2n) | 不稳定 | 较复杂 |
这里我们可以做一些关于复杂度的推理。
如果我们在选取基准p的时候,每次选取的都是当前数组中最小的一个元素,那么每次划分都只是让数组中的元素少1(被筛选出来的那个元素当然有序),这样一来就需要反复遍历数组导致复杂度变成了O(n2)。
如果我们在选取基准p的时候,每次选取的都是当前数组中最中间的一个元素(是中位数,而不是元素位置上的中间),那么每次划分都把当前数组划分成了长度相等的两个子数组,这样一来复杂度变成了O(nlog2n)。
标签:
原文地址:http://blog.csdn.net/lemon_tree12138/article/details/50622744