经典排序算法之快速排序
来源:互联网 发布:java标识符是什么 编辑:程序博客网 时间:2024/05/16 10:21
快速排序是排序算法中最应该掌握的一种,其排序策略同冒泡排序一样属于交换排序。其基本步骤可概括为以下几步:
1、判断输入参数的合法性;
2、把数组中第一个(或最后一个)记录的关键字作为比较基准,比该关键字小的记录排列在它左边,比该关键字大的记录排列在它右边;
3、按照步骤2的方法,分别对左边的数组和右边的数组进行步骤(2)一样的操作。
快速排序c++实现,参考代码如下(代码中步骤2采用最后一个记录的关键字做为比较基准):
// 快速排序#include <iostream>using namespace std;void swap(int &fir, int &sec){int temp = fir;fir = sec;sec = temp;}void print(int *input, int len){for (int i = 0; i < len; ++i){cout << input[i] << " ";}cout << endl;}/////////////////////////////////////////////////////////////////// 得到分割点处位置索引int getPartitionPos(int *input, int start, int end){int temp = input[end];int j = start - 1;for (int i = start; i < end; ++i){if (input[i] <= temp){j++;if (i != j){swap(input[i], input[j]);}}}swap(input[j + 1], input[end]);return (j + 1);}void quick_sort(int *input, int start, int end){if (start>=end) return;int middle; // 分割点位置middle = getPartitionPos(input, start, end);quick_sort(input, start, middle - 1);quick_sort(input, middle + 1, end);}void QuickSort(int *input, int len){if (input == nullptr || len <= 0)return;quick_sort(input, 0, len-1);}/////////////////////////////////////////////////////////////////int main(int argc, char *argv[]){int input[] = { 72, 13, 8, 94, 24, 50, 2, 28, 62, 75, 49 };int len = 11;print(input, len);QuickSort(input, len);print(input, len);system("pause");return 0;}
算法分析:
1、上述代码最关键部分就是得到分割点处位置索引。为了更清楚理解,不妨自行在纸上模拟计算机实现过程,或加断点后单步跟踪调试(或参考:http://www.cnblogs.com/pugang/archive/2012/06/27/2565093.html);
2、平均时间复杂度为:O(n log n);
3、稳定性:不稳定; 当执行这一步时,有可能打乱元素稳定性;
swap(input[j + 1], input[end]);
4、相应改进:快速已经相对完善,具体实现起来时主要是getPartitionPos()函数的实现方法不尽相同。后来一些相应改进思路包括:1)对比较基准(也有称为枢轴)选取的优化;本例选取了input[end],其他的还有三数取中、九数取中、随机选取等,当然相应的实现代码还需要作对应调整;2)待排序记录数目较小时用直接插入排序;当总记录较小时用快速排序反而效率并不一定高,有大材小用之嫌,可以在实际使用时设置一个待排序记录数目阈值,即超过该阈值用快速排序,否则用直接插入排序;3)其他在交换和逆归方面的优化(感兴趣的可以自行研究)。
- 经典算法之快速排序
- 经典算法之快速排序
- 经典算法之快速排序
- 经典算法之快速排序
- 经典算法之快速排序
- 经典排序算法之快速排序
- c--经典算法之排序---快速排序
- 经典算法学习:排序之快速排序
- 经典排序算法之快速排序
- 经典排序算法之快速排序
- 经典排序算法之快速排序
- 经典排序算法之:快速排序
- 【排序算法】经典排序算法之快速排序
- 经典算法之快速排序算法
- 经典算法之交换排序(冒泡排序、快速排序)
- 【经典排序算法】快速排序
- 经典排序算法--快速排序
- [快速排序] 经典排序算法
- POJ 2104 K-th Number【整体二分 + 树状数组】
- apache配置rewrite重定向时RewriteEngine On 发生403forbidden问题
- hdu1358 kmp的next数组求循环节
- Vtk图像处理
- [linux]ln命令
- 经典排序算法之快速排序
- Ant自动打包
- HDU 5245 Joyful(线段树、查询区间和及修改区间每个数为数的平方)
- automic&nonautomic, strong&weak, assign&retain区别
- 2016.4.29.maya help.
- Java8:读取文件到一个字符串
- LeetCode 003 Longest Substring Without Repeating Characters
- oracle异常处理
- HDU 4027 Can you answer these queries?(线段树、查询区间和及修改区间数为数的平方根)