快速排序优化
来源:互联网 发布:好用的安卓浏览器知乎 编辑:程序博客网 时间:2024/06/05 10:42
转载自:http://blog.csdn.net/wzy_1988/article/details/8043168
前言
今天要重写之前的快排算法,重新翻看自己之前的博客,总是会有稚嫩的感觉,这是好事,说明我一直在进步!
快排是分治策略很好的应用,IT面试大部分都会考察你对快排算法的掌握,博主面试阿里巴巴、创新工厂均在快排算法上有涉及,这里记录一下
算法思想
快速排序采用了一种分治策略,学术上称之为分治法(Divide-and-Conquer Method)
分治的基本思想
将原问题分解成若干个规模更小但是结构跟原问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解合并为原问题的解
快排的思想
设当前需要排序的数组为int A[bt...ed]
分解:
在A[]中任选一个记录作为基准(pivot),以pivot为基准将数组A划分为两个小的数组A[bt...pivot-1]和A[pivot+1...ed],并使左边的数组元素均小于等于pivot,右边数组元素均大于等于piovt。此时,pivot处于正确的位置上,它不需要再参加后续的排序
求解:
递归的调用快速排序,对A[bt...pivot-1]和A[pivot+1...ed]进行快速排序
递归的调用快速排序,对A[bt...pivot-1]和A[pivot+1...ed]进行快速排序
组合:
跟归并排序不同,因为每次调用快速排序,左右两个数组均已有序,因此对于快速排序来说,组合是一个空操作
实现代码(C语言)
快排用c实现其实可以直接调用系统的qsort函数,自己写compare比较函数即可,在php里是调用usort函数,但是面试考察大部分都是不能调用系统函数的,所以这里提供一下代码,供参考:
- /**
- * 基准点排序
- *
- * T = O(n)
- *
- */
- int pivotLoc(int *arr, int bt, int ed)
- {
- int stand;
- stand = arr[bt];
- while (bt < ed) {
- while (bt < ed && arr[ed] >= stand) ed --;
- if (bt < ed) arr[bt ++] = arr[ed];
- while (bt < ed && arr[bt] <= stand) bt ++;
- if (bt < ed) arr[ed --] = arr[bt];
- }
- arr[bt] = stand;
- return bt;
- }
- /**
- * 快排入口代码,递归策略
- *
- * T = O(nlogn)
- *
- */
- void quickSort(int *arr, int bt, int ed)
- {
- int pivot;
- if (bt < ed) {
- pivot = pivotLoc(arr, bt, ed);
- quickSort(arr, bt, pivot - 1);
- quickSort(arr, pivot + 1, ed);
- }
- }
优化
快排的平均时间复杂度是O(nlogn),但是考虑一下最坏的情况:
假设给定的排序序列是逆序,例如5、4、3、2、1,然后用上述快排代码进行从小到大排序,很明显,快排从O(nlogn)降到了O(n^2),如何避免这种情况呢?
解答:基准点的随机选取,我这里每次采用mid作为基准点
- /**
- * 快排优化,随机选取基准点
- *
- */
- void optimizeSort(int *arr, int bt, int ed)
- {
- int mid = bt + ((ed - bt) >> 1);
- // 不使用额外空间,进行两数互换
- if (arr[bt] != arr[mid]) {
- arr[bt] = arr[bt] ^ arr[mid];
- arr[mid] = arr[bt] ^ arr[mid];
- arr[bt] = arr[bt] ^ arr[mid];
- }
- }
- /**
- * 基准点排序
- *
- * T = O(n)
- *
- */
- int pivotLoc(int *arr, int bt, int ed)
- {
- int stand;
- // 快排优化
- if (bt < ed) {
- optimizeSort(arr, bt, ed);
- }
- stand = arr[bt];
- while (bt < ed) {
- while (bt < ed && arr[ed] >= stand) ed --;
- if (bt < ed) arr[bt ++] = arr[ed];
- while (bt < ed && arr[bt] <= stand) bt ++;
- if (bt < ed) arr[ed --] = arr[bt];
- }
- arr[bt] = stand;
- return bt;
- }
- /**
- * 快排入口代码,递归策略
- *
- * T = O(nlogn)
- *
- */
- void quickSort(int *arr, int bt, int ed)
- {
- int pivot;
- if (bt < ed) {
- pivot = pivotLoc(arr, bt, ed);
- quickSort(arr, bt, pivot - 1);
- quickSort(arr, pivot + 1, ed);
- }
- }
0
上一篇:直白快速排序算法,C语言实现
下一篇:移位运算(左移和右移)
相关热门文章
- 堆和栈的区别
- select,poll,epoll区别
- 浅淡淘宝内核对LVS的性能优化...
- 英特尔1亿美元成立中国智能设...
- SEOer分析导致首页被K的几个因...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- 我的ChinaUnix博客被锁定了,...
- 怎样破解雅虎邮箱密码...
- 虚拟机中ubuntu无线连接问题...
- IBM DS3400 盘阵怎么查看是单...
- 启动auditd时,报错如下,怎么...
评论热议
0 0
- 快速排序及其优化
- 快速排序及优化
- 快速排序及其优化
- 优化 快速排序
- 快速排序(优化版)
- 快速排序及优化
- 快速排序的优化
- 快速排序的优化
- 快速排序<优化>
- 随机优化快速排序
- 快速排序优化
- 优化的快速排序
- 快速排序及优化
- 快速排序优化
- 快速排序及优化
- 快速排序优化分析
- 快速排序的优化
- 快速排序及优化
- hdu 1234
- c语言中的static和extern关键字
- maven javaee7 tomcat8 jsp+servlet
- 浅谈c语言内存分区
- 直白快速排序算法,C语言实现
- 快速排序优化
- 移位运算(左移和右移)
- 卡特兰数
- oracle学习 数据完整性
- 贪心算法之活动规划问题
- 常用Unix命令
- 堆排序
- Chef Counting Matrices 矩阵
- 最大子段和最大子段积java实现