快速排序

来源:互联网 发布:手机淘宝怎么没彩票了 编辑:程序博客网 时间: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