经典排序算法之快速排序

来源:互联网 发布: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)其他在交换和逆归方面的优化(感兴趣的可以自行研究)。



1 0
原创粉丝点击