问一个简单的快速排序的问题,关于处理重复元的方法

yuxi1989 2015-05-10 03:53:14

#include <iostream>
#include <vector>

using namespace std;

int quicksort (vector<int>::iterator i, vector<int>::iterator j)
{
if (i>=j)
return 0;
else
{
int pval;
int a=*i, b=*(i+(j-i)/2), c=*j;
if (a<b && b<c)
pval=b;
else if (a<b && c<a)
pval=a;
else
pval=c;
vector<int>::iterator m=i, n=j;
while(m<n)
{
while (*m<pval)
m++;
while (*n>pval)
n--;
if (m<n)
swap(*m,*n);
}
quicksort(i,m-1);
quicksort(m+1,j);

}
}

int main()
{
vector<int> a;
for (int i=0;i<7;i++)
{
int tmp;
cin>>tmp;
a.push_back(tmp);
}
quicksort(a.begin(),a.end()-1);
for (int i=0;i<a.size();i++)
cout<<a[i]<<endl;
return 0;
}

上面是我写的快速排序算法,问题是,当有重复元素时,就死循环了。比如1,2,3,4,5,3,6,选择3作为基准元,则m=2,n=5(对应元素都是3),这个时候就不停的交换两个3,m、n也不变化,就死循环了。请问如何改进呢?
有的书上写先m++、n--然后再while,但感觉也不对。当m=2,n=5时,交换元素,变为1,2,3,4,5,3,6,然后m++、n--,则m=3(指向4),n=2(指向3)停止。但此时递归的调用就不对了,因为m没有停止在基准元上。所以,这个地方该怎么写呢?谢谢!
...全文
354 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-05-13
  • 打赏
  • 举报
回复
哦,错了!不重复的时候也归在小的一组了。
还是要用我#5的方法。
Tiger_Zhao 2015-05-13
  • 打赏
  • 举报
回复
#3的方法不是对的吗?
也是相等的时候把*m归在小的一组。
Tiger_Zhao 2015-05-13
  • 打赏
  • 举报
回复
if (m<n)
swap(*m,*n);

相等的时候把*m归在小的一组,*n还是当作pval。
if (m<n) {
if (*m==*n)
m++
else
swap(*m,*n);
}

cnmhx 2015-05-12
  • 打赏
  • 举报
回复
这个我主要是选择基元,头中尾三个元素选择中间的一个元素作为基元。 当相等的时候,基元的选择就不停止了!
cnmhx 2015-05-11
  • 打赏
  • 举报
回复
if (a<b && b<c) pval=b; else if (a<b && c<a) pval=a; else pval=c; 相等的时候不要交换。 你这里没有a=b,c=a...之类的case.
super_miker 2015-05-11
  • 打赏
  • 举报
回复

            while (*m<pval)
                m++;
            while (*n>pval)
                n--;
改为

            while (*m<=pval)
                m++;
            while (*n>=pval)
                n--;
yuxi1989 2015-05-11
  • 打赏
  • 举报
回复
引用 1 楼 cnmhx 的回复:
if (a<b && b<c) pval=b; else if (a<b && c<a) pval=a; else pval=c; 相等的时候不要交换。 你这里没有a=b,c=a...之类的case.
这个我主要是选择基元,头中尾三个元素选择中间的一个元素作为基元。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧