算法 -- 快速排序
2015-11-30 22:01
239 查看
引言:
排序算法很久没有些过啦,前段时间写了最基础的选择排序和冒泡排序,当时写它们就是为了找感觉.于是今天复习了快速排序的算法.
算法思想:
其实它的思想也很简单:
1.自己确定一个标志数key作为比较对象.
2.从最后一个开始,寻找第一个小于key的,并将其放在当前first上.
3.从第一个开始,寻找第一个大于key的,并将其放在当前last上.
4.如果first仍然小于last,继续执行2,3步骤;否则跳出循环,将key放在first上.
5.以key作为分界线,对两部分进行递归处理即可.
代码如下:
排序算法很久没有些过啦,前段时间写了最基础的选择排序和冒泡排序,当时写它们就是为了找感觉.于是今天复习了快速排序的算法.
算法思想:
其实它的思想也很简单:
1.自己确定一个标志数key作为比较对象.
2.从最后一个开始,寻找第一个小于key的,并将其放在当前first上.
3.从第一个开始,寻找第一个大于key的,并将其放在当前last上.
4.如果first仍然小于last,继续执行2,3步骤;否则跳出循环,将key放在first上.
5.以key作为分界线,对两部分进行递归处理即可.
代码如下:
/************************************************************************* ** > Name : QSort.cpp ** > Author: LiYingXiao (Sweethreart502) ** > Mail : liyingxiao502@gmail.com ** > Blog : http://blog.csdn.net/u013166575 ** > Created Time: 2015年11月30日 星期一 20时50分59秒 ************************************************************************/ #include <iostream> #define N 5 void QSort ( int a[] , int low , int high ) { // 首先检查参数合法性 if ( low >= high ) { return ; } int first = low , last = high ; // 以第一个为基准 int key = a[low] ; while ( first < last ) { // 后面的与key比较,如果小于key,则更换first值;反之last减一 while ( first < last && a[last] >= key ) { last-- ; } a[first] = a[last] ; // 前面的与key比较,如果大于key,则更换last值;反之first加一 while ( first < last && a[first] <= key ) { first++ ; } a[last] = a[first] ; } // 循环结束,将key值存储在当前first/last所在位置 a[first] = key ; // 接下来继续递归调用 QSort ( a , low , first - 1 ) ; QSort ( a , first + 1 , high ) ; } // 主函数 int main ( int argc , char * argv[] ) { int a[] = { 12 , 13 , 21 , 15 , 32 } ; // 排序前输出 std::cout << "before of the Sort :" << std::endl ; for ( int i = 0 ; i < N ; i++ ) { std::cout << a[i] << " " ; } std::cout << std::endl ; QSort ( a , 0 , N - 1 ) ; // 排序后输出 std::cout << "after of the Sort :" << std::endl ; for ( int i = 0 ; i < N ; i++ ) { std::cout << a[i] << " " ; } std::cout << std::endl ; return 0 ; }
相关文章推荐
- Xcode iPhone工程变成了My Mac 解决办法
- UICollectionView
- jQuery 中 attr() 和 prop() 方法的区别
- Bootstrap 历练实例 - 折叠(Collapse)插件事件
- Linux 权限相关
- 容器总结——array、vector、deque
- 南大软院大神养成计划--day15
- 神经网络(9)--如何求参数: backpropagation algorithm(反向传播算法)
- MyBatis底层基础和拦截器 - 第一部分
- Ruby命令行参数介绍
- UVa_10129_欧拉道路(回路)详解
- 用户角色权限管理系统-----java web 脚手架搭建(一)
- 注解
- 线性表转置
- 改进的延时函数Delay(使用MsgWaitForMultipleObjects等待消息或超时的到来)
- bzoj1069[SCOI2007]最大土地面积
- return status
- hive和hbase比较(整理)
- C#综合揭秘——深入分析委托与事件
- 菜鸟好文推荐(二十四)——用算法告诉你为何手机摔落时总是屏幕朝下?