快速排序(分治法O(nlogn))
2016-03-15 19:35
281 查看
划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于等于右边的任意元素。
递归求解:把左右两部分分别排序。
合并问题:不用合并,因为此时数组已经完全有序。
如果将“划分问题”单独写成一个函数,程序会清爽些:
递归求解:把左右两部分分别排序。
合并问题:不用合并,因为此时数组已经完全有序。
void qsort(int L,int R){ if(L>=R)return; int l=L,r=R; int key=a[l];//取a[l]为关键字 while(l<r){ while(l<r&&a[r]>=key)r--; a[l]=a[r]; //由于a[l]最初被保存在key中,所以可以被覆盖 while(l<r&&a[l]<=key)l++; a[r]=a[l]; //由于先执行了第8行,所以a[r]在这里可以被覆盖 } a[l]=key; qsort(L,l-1);//对分界点左边快排 qsort(l+1,R);//对分界点右边快排 }
如果将“划分问题”单独写成一个函数,程序会清爽些:
int part(int l,int r){//排序并返回分界点 int key=a[l]; while(l<r){ while(l<r&&a[r]>=key)r--; a[l]=a[r]; while(l<r&&a[l]<=key)l++; a[r]=a[l]; } a[l]=key; return l; } void qsort(int l,int r){ if(l>=r)return; int p=part(l,r); qsort(l,p-1);//对分界点左边快排 qsort(p+1,r);//对分界点右边快排 }
相关文章推荐
- 通用JSON生成器3
- Makefile 学习日记(三)——makefile的瘦身
- 从MAC上生成pem文件用于推送
- springmvc /struts2工作机制
- 第3周项目1 个人所得税计算器
- iOS小技巧17-iPhone如何安装ipa包
- 一个大神程序员的使命感究竟应该是什么
- 搞清arguments,callee,caller
- lightoj 1234 - Harmonic Number 【分块打表】
- hdoj 5642 King's Order 【数位dp】
- iOS UI 的坑:不要 remove UITableViewCell 的 contentView
- 关于final
- 最大子序列-NlogN
- 关于“只有注册用户登录后才能阅读该文”
- 20160310第一题
- 图像识别数据库
- hdoj 5641 King's Phone 【模拟】
- LinuxMySQL主从配置
- 网易2016年研发工程师编程题(1)
- Android Studio的*.9.png报错问题-Crunching Cruncher