快速排序
2015-08-04 23:30
274 查看
今晚日了狗了,快速排序很久以前就写过,今天写了一下确经常出现死循环,调了一晚上才调出来
测试代码如下
bool comp(const T& a, const T&b) { return a < b; } template <typename T> void quicksort(T *begin, T *end ,bool(*func)(const T&a, const T & b) = comp) { if (begin >= end-1) return; T *i, *j; i = begin + 1; j = end - 1; while (i < j) { //问题出在这里,递增i时必须是<=,递减j的时候同理,必须是>=,测试数据如三个相同的数据{99,99,99},如果没有等号则陷入死循环 while (i < j&&(func(*i, *begin)||!func(*begin,*i))) ++i; while (j > i&&(func(*begin, *j)||!func(*j,*begin))) --j; if (i != j) { T temp = *i; *i = *j; *j = temp; } } //对于这里的判断,是这个代码的缺陷。先递增i再递减j,就会出现当i=j时,要比较begin和*i T *t; if (func(*i, *begin)) t = i; else t = i - 1; T temp = *t; *t = *begin; *begin = temp; if (t != begin) { quicksort(begin, t, func); } quicksort(t+1, end,func); }换了种思路重写,看起来就清爽了很多
template <typename T> void quicksort(T *begin, T *end, bool(*func)(const T &a, const T &b) = comp) { if (begin >= end-1) return; T temp = *begin; T *i = begin; T *j = end-1; while (i < j) { while ((func(temp, *j)||!func(*j,temp)) && j>i) --j; while ((func(*i, temp)||!func(temp,*i)) && i < j) ++i; if (i < j) { T sp = *i; *i = *j; *j = sp; } } *begin = *i; *i = temp; quicksort(begin, i, func); quicksort(i + 1, end, func); }
测试代码如下
int main() { srand((unsigned int)time(NULL)); int n; while (cin>>n&&n) { int *buf = new int ; for (int i = 0;i < n;++i) { buf[i] = rand() % 100; cout << buf[i] << ' '; } cout << endl; quicksort(buf, buf + n); for (int i = 0;i < n;++i) { cout << buf[i] << ' '; } cout << endl; delete[] buf; } return 0; }
相关文章推荐
- 欧拉回路及其构造
- linux下shell脚本执行jar文件
- 加快mysql导入导出速度
- Ruby
- BeanUtils.populate的作用 !
- 一个java老菜鸟的而立之感(一)
- ps学习笔记二(矢量图)
- 【罗辑思维】物种战争
- UEditor的配置和使用(单独图片与文件上传)
- 背包算法解决一道华为面试题
- Spring 中设置依赖注入
- 对给定字符串,取出它的子字符串,并把子字符串按照长度排序
- Linux下Weblogic 11g R1安装和配置
- Leetcode: Count Primes
- 阻塞队列自定义实现 in Java
- 数组
- Linux线程同步概述
- Unity导出项目
- 没人告诉你关于z-index的一些事
- 去除字符串中的重复子字符串