排序算法(四)-- 快速排序
来源:互联网 发布:淘宝订单p图教程 编辑:程序博客网 时间:2024/06/07 11:57
快速排序
快速排序通常是用于排序的最佳选择。虽然其在最坏的情况下运行时间为O(n^2),但是其平均性能相当好O(nlgn),且O(nlgn)中隐含的常数因子很小。另外,它还能够进行就地排序。
快速排序的描述
快速排序基于分治模式。 对数组A[p .. r]排序的分治过程:
- 分解: 数组A[p .. r]被划分成两个(可能空)子数组A[p .. q-1] 和 A[q+1 .. r], 使得A[p .. q-1]中的每个元素都小于等于A(q),而且,小于等于A[q+1 .. r]中的元素。下标q也在这个划分过程中进行计算;
- 解决: 通过递归调用快速排序,对子数组A[p .. q-1]和A[q+1 .. r]排序;
- 合并: 因为两个子数组是就地排序的,将它们合并不需要操作:整个数组A[p .. r]已经排序。
下图实现快速排序
数组划分:
快速排序中的PARTITION过程,对数组A[p .. r]进行就地重排
过程如下:
下图展示了PARTITION的操作过程:
这里,p指向数组的第一个元素,r指向数组的最后一个元素,i, j指定了数组A中大于元素A[r]的区间,i 指向起始位置的前一个位置,j 指向结束位置。当A[j]中的元素小于A[r]时,i后移一位(i = i+1),交换A[i]和A[j]. 直至j = r -1时,交换A[r]和A[i+1]的元素,返回 i+1.
完整的实现代码
/*快速排序算法实现*/#include<iostream>using namespace std;//函数声明int Partition(int A[], int p, int r);void QuickSort(int A[], int p, int r){int q;if(p < r) //递归条件{q = Partition(A,p,r);QuickSort(A, p, q-1);QuickSort(A, q+1, r);}}// 对数组进行就地重排int Partition(int A[], int p, int r){int i,j,x,temp;x = A[r];i = p-1; //i表示大于A[r]的子序列的下界的位置for(j = p; j <= r-1; j++) //i表示大于A[r]的子序列的上界的位置{if(A[j] <= x){i = i + 1; // 交换A[i]和A[j]temp = A[i];A[i] = A[j];A[j] = temp;}}temp = A[r];A[r] = A[i+1];A[i+1] = temp; return i+1;}
排序结果:
0 0
- 排序算法(四)快速排序算法
- 排序算法(四):快速排序
- 排序算法(四)-- 快速排序
- Java排序算法(四):快速排序
- 快速排序----(排序算法四)
- 排序算法(四):快速排序
- 算法导论排序算法之快速排序(四)
- (四)算法--排序算法分治 快速排序
- 算法学习(四)----快速排序
- 常用算法总结之排序(四)----快速排序
- 排序算法的数组实现 -- 快速排序(四)
- 神的规范:排序算法(四):快速排序
- 排序算法(四)——快速排序
- 算法——排序(四)快速排序
- PHP基础排序算法(四)快速排序
- 算法系列(四)排序算法中篇--归并排序和快速排序
- 快速排序(算法)
- 快速排序(算法)
- 栈和队列的互相实现
- TRIZ理论的进化法则分析(TRIZ学习笔记)
- 数据统计(fopen版)
- lua的string库与强大的模式匹配
- Linux文件系统的实现
- 排序算法(四)-- 快速排序
- linux条件变量若干问题
- 远程备份脚本
- Flash+js幻灯片超炫的效果,值得一看
- epoll与select
- 字符串函数---strstr()、memchr()、strchr()详解及实现
- rotate旋转分析(编程珠玑第二章)
- 数据结构与算法分析 - 快速排序
- XHTML中按钮添加超链接以及使插入图片与屏幕一样大