您的位置:首页 > 其它

快速排序

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: