快速排序
来源:互联网 发布:手机淘宝怎么没彩票了 编辑:程序博客网 时间:2024/05/16 14:02
今晚日了狗了,快速排序很久以前就写过,今天写了一下确经常出现死循环,调了一晚上才调出来
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和*iT *t;if (func(*i, *begin))t = i;elset = 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[n];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;}
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 欢迎使用CSDN-markdown编辑器
- Java中的键盘监听事件KeyListener
- Android 开源项目
- 【实例】使用canvas缓缓加载一个图片到web页面中
- 杭电-N皇后问题(经典DFS搜索)
- 快速排序
- JAVA拾遗——设计模式,单例模式。
- 10002---SpringMVC HelloWorld
- Android核心基础-8.Android四大组件之Activity-1.创建、启动
- POJ_2096_CollectingBugs
- N-Queens II
- muduo:Channel、Poller分析
- CSS+html:魔兽世界网页仿制
- 高分八号卫星